Как объединить таблицы, полученные в результате подзапросов в Laravel 4.2

Я создал запрос в mysql, который использует подзапрос. Я попытался воспроизвести этот запрос в Laravel 4.2 следующим образом:

$store_booklets = DB::table('booklets')
                            ->select(
                                'booklets.id',
                                'booklets.title',
                                'booklets.start_date',
                                'booklets.end_date'
                            )
                            ->join('booklet_store', function ($join) use ($storeId) {
                                $join->on('booklets.id', '=', 'booklet_store.booklet_id')
                                     ->where('booklet_store.store_id', '=', $storeId);
                            })
                            ->whereRaw('booklets.active = 1')
                            ->whereRaw('booklets.start_date < curdate()')
                            ->whereRaw('booklets.end_date > curdate()');


$store_booklets_products = DB::table('booklet_product')
                             ->select('*')
                             ->join(DB::raw("({$store_booklets->toSql()}) as store_booklets"), function ($join) {
                                 $join->on('booklet_product.booklet_id', '=', 'store_booklets.id');
                             });

Когда я делаю $store_booklets_products->get(), это дает мне

SQLSTATE [HY000]: общая ошибка: 2031

Хотя, если я делаю $store_booklets_products->toSql(), он выводит правильный sql-запрос.

Я не могу понять, что не так с запросом. У меня была аналогичная проблема в Laravel 5 до того, как это было связано с использованием метода where внутри подзапроса. Я решил ее, используя вместо этого whereRaw. Но это не работает в Laravel 4.2.

В этот вопрос касается того, что следует использовать метод mergeBindings($subqueryQueryBuilder) при выборе из таблица, полученная в результате подзапроса, и я попробовал это

$store_booklets_products = DB::table('booklet_product')
                                    ->mergeBindings($store_booklets)
                                    ->select('*')
                                    ->join(DB::raw("({$store_booklets->toSql()}) as store_booklets"), function ($join) {
                                        $join->on('booklet_product.booklet_id', '=', 'store_booklets.id');
                                    });

но в моем случае ошибка сохраняется.

Кто-нибудь знает, что я могу делать неправильно?


person António Quadrado    schedule 01.06.2017    source источник


Ответы (1)


Эта проблема действительно была связана с привязками построителя запросов. Поскольку я передавал переменную $storeId в подзапрос, при сборке запроса мне пришлось добавить метод addBinding, передавая ему $storeId, вот так:

$store_booklets_products = DB::table('booklet_product')
                                    ->select('*')
                                    ->join(DB::raw("({$store_booklets->toSql()}) as store_booklets"), function ($join) {
                                        $join->on('booklet_product.booklet_id', '=', 'store_booklets.id');
                                    })
                                    ->addBinding($storeId);

Согласно это класс Grammar сбрасывает привязки во время компиляции, следовательно, необходимо повторно прикрепить его.

person António Quadrado    schedule 01.06.2017