Как выполнить подзапрос трех таблиц в eloquent

#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();