6

codeigniterでこの問題が発生しました:データベースからナビゲーションツリーシステムを作成しようとしています。

モデル:

function getServices()
{
 $this->db->select('service_url, service_title, category_title');    
 $this->db->join('services_category', 'services_category.id=services.category_id');    
 $this->db->group_by('category_title');
 $this->db->order_by('service_title', 'ASC');    
 $query = $this->db->get('services');

 if($query->result() == TRUE)    
 {    
    foreach($query->result_array() as $row)
    {
       $result[] = $row;
    }
    return $result;
  }
}

見る:

<?php if(isset($services) && $services) : foreach($services as $s) : ?>    
   <ul>
     <li><a href="#"><?php echo $s['category_title'] ?></a>    
       <ul>
        <li><?php echo anchor('services/' . $s['service_url'], $s['service_title']); ?></li>
       </ul>    
     </li>    
   </ul>    
<?php endforeach; ?>    
<?php endif; ?>

これまでのところ良好な結果として、各カテゴリが想定どおりに返されますが、サービスはカテゴリごとに1つのサービスのみを返し、一部のカテゴリでは15のサービスが返されます。誰かが私に手を差し伸べてくれたり、何が悪いのか説明してくれませんか?どうもありがとう。

「私はphpやcodeigniterの専門家ではありません。少し前に始めたばかりなので、初心者を撮影しないでください。」

注:group_byとorder_byを使用せずに試し、すべてのサービスを返していますが、カテゴリが繰り返されています、

元:

category-a
   service1
category-a
   service2
category-b
   service10
category-b
   service11
category-c
   service30
category-c
  service31
....
4

1 に答える 1

5

これは、 Group By(MySQL)を使用する場合の集計関数に適しています。簡単な説明は次のようになります

Date        | Amount
2012-01-01  | 5
2012-01-01  | 6
2012-01-02  | 1
2012-01-02  | 6

現在、このようなSUM集計関数を使用しています。

SELECT Date, SUM(Amount) as Total FROM table GROUP BY Date ORDER BY DATE;

結果は次のようになります。

Date        | Amount
2012-01-01  | 11
2012-01-02  | 7

シナリオでGROUP BYは、クエリをカテゴリごとにグループ化したため、カテゴリが1つしか取得されないため、意図したとおりに機能しません。

これに対する理想的な解決策は、2つの別々の関数とGetCategoriesを使用することGetServicesです。

function getServices($category_id = false)
{
  $this->db->select('service_url, service_title, category_title');
  $this->db->join('services_category', 'services_category.id=services.category_id');
  if ($category_id !== false)
    $this->db->where('services.category_id', $category_id);
  $this->db->order_by('service_title', 'ASC');
  $query = $this->db->get('services');

  if($query->result() == TRUE)
  {
    foreach($query->result_array() as $row)
    {
      $result[] = $row;
    }
    return $result;
  }
}

function getCategories()
{
  $this->db->select('category_id, category_title');
  $this->db->order_by('category_title', 'ASC');
  $query = $this->db->get('services_category');

  if($query->result() == TRUE)
  {
    foreach($query->result_array() as $row)
    {
      $result[] = $row;
    }
    return $result;
  }
}

次に、ビューファイルで、カテゴリに対してforループを実行してから、カテゴリごとに別のクエリを実行する必要があります。これがどのように見えるかの概要です、

<?php if(isset($categories) && $categories) : foreach($categories as $category) : ?>
  <ul>
    <li><a href="#"><?php echo $category['category_title'] ?></a>
      <ul>
        // how you get $services is similar to how you get $categories
        <?php $services = $this->modelname->getServices($category['category_id']);
        <?php foreach($services as $s) : ?>
          <li><?php echo anchor('categories/' . $s['service_url'], $s['service_title']); ?></li>
        <?php endforeach; ?>
      </ul>
    </li>
  </ul>
<?php endforeach; ?>
<?php endif; ?>
于 2012-10-17T02:05:05.190 に答える