Как извлекать реляционные данные в CodeIgniter

#php #mysql #codeigniter #foreach #fetch

#php #mysql #codeigniter #foreach #извлекать

Вопрос:

Мне нужно получить две реляционные таблицы с foreach помощью метода в CodeIgniter. Это только пример кода, который я предоставляю в своем вопросе, мне это обязательно понадобится для моих будущих проектов, и я совершенно не понимаю, какой запрос для этого.

Вот таблица покупателя:

  ---- ------ 
| id | name |
 ---- ------ 
|  1 | John |
|  2 | Jane |
 ---- ------ 
  

Вот таблица товаров:

   ---- ---------- ------------ 
 | id | buyer_id | goods_name |
  ---- ---------- ------------ 
 |  1 |        1 | Apple      |
 |  2 |        1 | Grape      |
 |  3 |        1 | Banana     |
 |  4 |        2 | Pear       |
 |  5 |        2 | Mango      |
  ---- ---------- ------------ 
  

В моем файле модели mtest:

 public function buyer_list()
{
    $this->db->select('*');
    $this->db->from('buyer');
    $query = $this->db->get();
    return $query->result();
}


public function order_list()
{
    $this->db->select('*');
    $this->db->from('goods');
    $this->db->join('buyer', 'buyer.id = goods.buyer_id', 'inner');
    $query = $this->db->get();
    return $query->result();
}
  

В моем контроллере:

 public function index()
{
    $this->load->model('mtest');

    $data['buyer']  =   $this->mtest->buyer_list();
    $data['order']  =   $this->mtest->order_list();

    $this->load->view('example', $data);
}
  

На мой взгляд, пример файла:

 <div id="container">
   <?php foreach ($buyer as $buyer_list): ?>
    <strong><?php echo $buyer_list->name ?></strong>: 
    <ul>
        <?php foreach ($order as $order_list): ?>
        <li><?php echo $order_list->goods_name ?></li>
        <?php endforeach; ?>
    </ul>
  <?php endforeach; ?>
</div>
  

Приведенные выше коды показали мне только всю строку таблицы товаров. Я хочу получить результат чего-то подобного:

    ------ ------------ 
  | John | : • Apple  |
  |      |   • Grape  |
             • Banana  
  |      |            |
    Jane   : • Pear    
  |      |   • Mango  |
   ------ ------------ 
  

Извините за мой плохой английский. Есть идеи?

Комментарии:

1. В ваших foreach циклах вы перезаписываете переменные.

2. У вас уже есть buyers в order , потому что вы присоединились к таблицам, поэтому нет необходимости вызывать buyer_list() функцию.

Ответ №1:

В контроллере сделайте это:

 public function index()
{
    $this->load->model('mtest');

    $orders  =   $this->mtest->order_list();


    $sortedOrders = [];
    foreach($orders as $order){
        $sortedOrders[$order->name][] = $order;
    }

    $this->load->view('example', [ "sortedOrders" => $sortedOrders ]);
}
  

В поле зрения:

 <div id="container">
   <?php foreach ($sortedOrders as $k=>$sortedOrder): ?>
    <strong><?php echo $k ?></strong>: 
    <ul>
        <?php foreach ($sortedOrder as $goods): ?>
        <li><?php echo $goods->goods_name ?></li>
        <?php endforeach; ?>
    </ul>
  <?php endforeach; ?>
</div>
  

Комментарии:

1. Спасибо, сэр, это работает! Но можете ли вы объяснить функцию каждого кода в вашем ответе? Я нуб

2. Поместите a var_dump($sortedOrders); , чтобы увидеть, как выглядит вложенный массив.

3. Вам лучше вносить изменения и просматривать изменения в браузере в качестве выходных данных. Таким образом, вы научитесь автоматически