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

В базе есть таблица 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;


Но конечно такой трюк не работает.
  • Вопрос задан
  • 526 просмотров
Решения вопроса 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 го массива

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

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
Бюро Цифровых Технологий Санкт-Петербург
от 120 000 до 180 000 ₽
07 мая 2024, в 11:27
1500 руб./в час
07 мая 2024, в 11:18
50000 руб./за проект
07 мая 2024, в 11:02
300 руб./за проект