Учение. QueryBuilder. Как прикрепить все категории со всеми опциями к результатам запроса - PullRequest
0 голосов
/ 10 января 2019

Я не знаю, как прикрепить массив вариантов и категорий для одного блюда. Я получаю только одну категорию и только один вариант в качестве результата запроса. Помогите пожалуйста:)

У меня есть блюдо. Это может быть связано с некоторыми категориями с опциями.

Блюдо - Пицца
Опции Категория - Аддоны
Варианты - двойной сыр, салями, перец, лук

Блюдо - Салат
Варианты Категория - Соус
Опции - олива, горчица, сметана

У меня также есть блюдо, которое можно связать с несколькими категориями опций.

Блюдо - Специальное блюдо
Опции Опции - Addons
Варианты - двойной сыр, салями, перец, лук
Варианты категории - Соус
Варианты - олива, горчица, сметана

Пример базы данных:

Блюдо
----
(Номер, имя)
1, Pizza
2, салат
3, специальное блюдо

  | 1..n
  V

Dish_Options_Category_Assoc
---------------------------
(id, dish_id, category_id)
1, 1, 6
2, 2, 7
3, 3, 6
4, 3, 7

  | n..1
  V

Dish_Options_Category
---------------------
(идентификатор, имя)
6, Аддоны
7, соус

  | 1..n
  V

Dish_Options
------------
(id, category_id, name)
11, 6, двойной сыр
12, 6, салями
13, 6, перец
14, 6, лук
15, 7, оливковое
16, 7, горчица
17, 7, сметана

В репозитории dish_options_category_assoc я ищу все блюда со всеми категориями и (я хочу подключить также все параметры)

    $q = $this->createQueryBuilder('d')
       ->where('d.dish = :did')
       ->join('d.categoryAssoc','ct')
       ->setParameters(array("did"=> $id)) 
       ->select('(d.dish) as dish_id','ct.id as cat_id','ct.name as cat_name')
       ->leftJoin('ct.options', 'o')
       ->addSelect('o.name as options')
       ->getQuery() 
       ->getResult();

    return $q;

Но я получаю только одну категорию и только один вариант.

Данные, которые я получил для одного «Специального блюда», к которому прикреплены 2 разные категории опций: (исправленный запрос выше)

Array (7) {
[0] => * * одна тысяча семьдесят девять массив (4) {
["dish_id"] => "3"
["cat_id"] => "6"
["cat_name"] => "Аддоны"
["options"] => "двойной сыр"
}
[1] =>
массив (4) {
["dish_id"] => "3"
["cat_id"] => "6"
["cat_name"] => "Аддоны"
["options"] => "салями"
}
[2] => * * тысяча девяносто-три массив (4) {
["dish_id"] => "3"
["cat_id"] => "6"
["cat_name"] => "Аддоны"
["options"] => "pepper"
}
[3] =>
массив (4) {
["dish_id"] => "3"
["cat_id"] => "6"
["cat_name"] => "Аддоны"
["options"] => "лук"
}
[4] =>
массив (4) {
["dish_id"] => "3"
["cat_id"] => "7"
["cat_name"] => "Соус"
["options"] => "оливковое"
}
[5] =>
массив (4) {
["dish_id"] => "3"
["cat_id"] => "7"
["cat_name"] => "Соус"
["options"] => "горчица"
}
[6] => * * тысячу сто двадцать одна массив (4) {
["dish_id"] => "3"
["cat_id"] => "7"
["cat_name"] => "Соус"
["options"] => "сметана"
}
}

Может кто-нибудь сказать мне, как прикрепить категории и параметры в качестве массива для блюда?

1 Ответ

0 голосов
/ 16 января 2019

Решение - Блюдо информация с категориями опций и с опциями:

$q = $this->createQueryBuilder('d')
    ->where('d.dish = :did')
    ->join('d.categoryAssoc','ct')
    ->setParameters(array("did"=> $id)) 
    ->leftJoin('ct.options', 'o')
    ->select('d','ct','o')
    ->getQuery() 
    ->getResult();

return $q;
...