Я новичок в 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; } }