Пользовательские SQL-запросы в Directus
Допустим, у меня есть такая структура базы данных MySQL:
Меню:
id name
3 Tartiflette
4 Lasagne
Ингредиент:
id name price
15 Carrot 2.00
39 Garlic 3.00
40 Reblochon 5.00
55 Onion 1.00
Menu_ingredient:
id ingredient_id menu_id quantity
4 15 4 2
5 55 4 1
6 39 4 1
7 40 3 2
8 55 3 3
Resa_menu:
id resa_id menu_id people
1 1 4 3
2 1 3 2
Реса:
id
1
Как я могу получить все ингредиенты из одной резервации, используя один параметр запроса с элементами / конечной точкой?
Я пробовал запрос, используя items/resa_menu? Fields=*.* (И некоторые другие комбинации, но не повезло).
Я также настроил представление SQL (виртуальная таблица), получая всю информацию, необходимую с помощью запроса, но этот вид SQL, похоже, не выбирается Directus.
SELECT
ingredient.name as ing_name,
(resa_menu.people * ingredient.price) as price,
(resa_menu.people * menu_ingredient.quantity) as quantity
FROM resa_menu
INNER JOIN menu ON menu.id = resa_menu.menu_id
INNER JOIN resa ON resa.id = resa_menu.resa_id
INNER JOIN menu_ingredient ON menu_ingredient.menu_id = menu.id
INNER JOIN ingredient ON ingredient.id = menu_ingredient.ingredient_id
GROUP BY ingredient.id;
Ожидаемый результат:
ing_name price quantity
Carrot 6.00 6
Garlic 9.00 3
Reblochon 10.00 4
Onion 3.00 3
Конкретная цель здесь - получить сводку всех ингредиентов, необходимых для бронирования (объединение всех меню, умножение количества на количество человек). Но мой вопрос более общий: как вы можете сделать несколько JOIN, как в этом запросе, с Directus API?
Большое спасибо за помощь!
2 ответа
Я думаю, что вы имеете в виду, что вы запрашиваете конечную точку /items/Resa_menu
и делать *.*
возвращается Menu_ingredient
связанные данные, однако вы хотите, чтобы список ингредиентов тоже вернулся? для этого, вы бы не просто изменили свой запрос полей на *.*.*
получить три уровня отношений?
Или это то, что ?fields=*.*
просто не работает вообще?
Используйте левое соединение, и вам не нужно группировать по
select i.name,(i.price* coalesce(rm.people,1)) as price,
(mi.quantity*coalesce(rm.people,1)) as quantity
from Ingredient i left join
Menu_ingredient mi on i.id =mi.ingredient_id
left join Resa_menu rm on mi.menu_id =rm.menu_id