#laravel #eloquent #subquery
#laravel #eloquent #подзапрос
Вопрос:
Проблема:
У меня есть таблица «disabled_product», в которой у меня есть product_id, menu_id, branch_id.
Я хочу получить все записи из disabled_product, где product_id = 4, и где product_id, menu_id в disabled_product совпадают с product_id, menu_id в menu_product
И
menu_id, branch_id в disabled_product совпадают с menu_id, branch_id в таблице branch_menu.
Я написал запрос, но он выдал мне ошибку «Нарушение количества элементов: 1242», потому что обе таблицы menu_product и branch_menu имеют совпадение нескольких записей. Я не знаю, как мне выполнить подзапрос к disabled_product и получить только те записи, которые соответствуют menu_product и branch_menu.
Любая помощь приветствуется.
Запрос:
$disabledProduct = DisabledProduct::where('branch_id', function ($query) use ($productID) {
$query->from('branch_menu')
->select('branch_menu.branch_id')
->where('branch_menu.menu_id', function ($query) use ($productID) {
$query->from('menu_product')
->select('menu_product.menu_id')
->where('menu_product.menu_id', function ($query) use ($productID) {
$query->from('menu_product')
->select('menu_product.menu_id')
->where('menu_product.product_id', $productID);
});
});
})
->where('product_id', $productID)
Таблица disabled_product:
Таблица menu_product:
Таблица branch_menu:
Комментарии:
1. Вы определили какие-либо отношения модели?
2. menu_product имеет отношения «многие ко многим» друг с другом, как и branch_menu, но disabled_product не имеет никакого отношения ни к одной из таблиц
Ответ №1:
Попробуйте сделать это, используя предложения подзапроса Where,
$productId = 4;
$disabledProducts = DisabledProduct::query()
->where('product_id', function ($query) {
$query->from('menu_product')
->select('product_id')
->where('menu_id', function ($query) {
$query->from('branch_menu')
->select('menu_id')
->whereRaw('branch_id = `disabled_product`.`branch_id`');
});
})
->where('product_id', $productId)
->get();