Как получить данные трёхмерным массивом?

В базе есть таблица menus и menu_items, у второй есть поле menu_id, связанное с полем id в первой таблице.

Необходимо по menu id получить одним запросом такой массив, в котором будет:

1. Элемент menu name с названием запрошенного меню
2 . Элемент menu_id с ID запрошенного меню.
3. Элемент items, представляющий собой вложенный массив из результатов поиска по таблице menu_items (фильтр по menu_id).

Можно это как-то реализовать запросом через PDO? Может использовать хранимые процедуры? Или временную таблицу?

Я описал это примерно так:

SELECT menus.id, 
menus.name, 
(SELECT * FROM menu_items WHERE menu_id = 1) as items
FROM menus
WHERE menus.id = 1;


Но конечно такой трюк не работает.
  • Вопрос задан
  • 532 просмотра
Решения вопроса 1
Джойны для кого старались, придумывали?
SELECT * FROM menus AS m LEFT JOIN menu_items AS mi ON (mi.menu_id=m.id) WHERE m.id=1;

А в массив потом в PHP переколбасите, как удобно будет.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
FanatPHP
@FanatPHP
Чебуратор тега РНР
Интересная задачка.
Клнечно, она была бы еще интереснее, если бы ты сразу написал нужный запрос, но и так хорошо.

В общем, можно попробовать похимичить с константами PDO::FETCH_*. То есть запросить избыточные данные, с дублированием элементов меню, и упорядочить константами. На праздники поиграюсьпоиграюсь

Хотя трехмерный получить наверное не получится. Ключами юудет имя меню а значениями - массив с сабменю
Ответ написан
Комментировать
65536
@65536
в элоквенте для этого есть удобная фича laravel.com/docs/4.2/eloquent#eager-loading

если вручную, то нужно делать 2 запроса. SELECT * FROM menus и SELECT * FROM menu_items. 2-й можно ограничить WHERE menu_id IN(идишники из результатов первого). Потом 2й нужно в цикле проиндексировать по menu_id, то есть сделать такой массив чтоб его индексы были идшниками из результатов первого, а элементы массивами со строками из результатов 2-го для соответствующих menu_id.

а при выводе уже просто по ид достаете из 2 го массива

но может есть вариант поизящней))
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы