Codeigniter – получать связанные строки данных как структуры / объекты, а не массивы

Я новичок в CodeIgniter.

Я создал модель для таблицы Pizza и таблицы ингредиентов. Таблицы соединены дополнительной таблицей Pizza_Ingredients (ее много-много отношений).

Моя модель:

<?php class Pizza extends DataMapper { var $table = 'Pizza'; var $has_many = array( 'ingredients' => array( 'class' => 'ingredients', 'join_table' => 'pizza_ingredients' ) ); } class Ingredients extends DataMapper { var $table = 'Ingredients'; var $has_many = array( 'pizza' => array( 'class' => 'pizza', 'join_table' => 'pizza_ingredients' ) ); } ?> 

Когда я получаю данные с помощью этого кода:

 $pm = new Pizza(); $pm->include_related('ingredients'); $array = $pm->get(); - $pm = new Pizza(); $pm->include_related('ingredients'); $array = $pm->get(); 

im, получая массив, который дублировал значения Pizza (он выглядит как результат SQL-запроса).

 margherita | cheese vegetariana | vegetable 1 vegetariana | vegetable 2 

Я не могу просто создать таблицу html в «foreach» в массиве, подобном этому.

Я хочу получить объект, который имеет структуру следующим образом:

 margherita: - cheese vegetariana: - vegetable 1 - vegetable 2 

что позволяет мне делать петлю foreach (с пиццей) с другой петлей foreach (с ингредиентами) внутри «петли пиццы».

Я должен написать это на PHP, или CodeIgniter / DataMapper может сделать что-то еще для меня?

Любой совет?

    Я просто застрял в одном ответе …

    Итак, в поисках DOC-модулей DI CAM Datamapper, я нашел что-то, что поможет (http://datamapper.wanwizard.eu/pages/getadvanced.html), посмотрите на первый пример!

    Переходя к вашей проблеме, должно быть так:

      // Create pizza $pm = new Pizza(); // DO NOT USE include_related to Ingredients Here !!! //Datamapper will DO THIS for you! // Remember to declare your Ingredients class in singular, not plural // So your class should be in singular -> Ingredient // And your DB Table should be in plural -> Ingredients // As CI Datamapper Guide teaches :) // Get all pizzas $pm->get(); // Loop through all pizzas foreach ($pm as $pizza) { // Print the actual pizza name echo $pizza->name."<br/>"; // Get the current pizza's Ingredients <- Here is the magic comes! $pizza->ingredient->get(); // Print all current pizza's Ingredients foreach ($pizza->ingredient as $ingredient) { echo $ingredient->name."<br/>"; } } -  // Create pizza $pm = new Pizza(); // DO NOT USE include_related to Ingredients Here !!! //Datamapper will DO THIS for you! // Remember to declare your Ingredients class in singular, not plural // So your class should be in singular -> Ingredient // And your DB Table should be in plural -> Ingredients // As CI Datamapper Guide teaches :) // Get all pizzas $pm->get(); // Loop through all pizzas foreach ($pm as $pizza) { // Print the actual pizza name echo $pizza->name."<br/>"; // Get the current pizza's Ingredients <- Here is the magic comes! $pizza->ingredient->get(); // Print all current pizza's Ingredients foreach ($pizza->ingredient as $ingredient) { echo $ingredient->name."<br/>"; } } 

    Эта работа очень хорошо для меня, но она по-прежнему поражает db много раз, на самом деле, один раз для каждой пиццы, которую содержит ваша БД.

    Я очень признателен, если какое-то решение с использованием CI Datamapper потребовало меньше запросов к БД.

    Пожалуйста, поделитесь, если найдете его!

    Почему бы не использовать промежуточную таблицу, чтобы разбить многие на многие отношения. Кажется намного легче управлять. Подобно:

     TABLE pizza_ingredients id pizza_id ingredient_id 

    Затем вы можете попробовать что-то вроде этого:

     foreach($pizzas as $pizza) $pizza->ingredients = $this->get_ingredients($pizza->id); 

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

     foreach ($pizza as $k=>$p) { if ($last_pizza === $p->pizza) { echo "<tr> <td> </td> </tr> <tr> <td> $p->cheese </td> </tr>"; $last_pizza = $p->pizza; }else{ echo "<tr> <td> $p->pizza </td> </tr> <tr> <td> $p->cheese </td> </tr>"; $last_pizza = $p->pizza; } }