Я создал запрос в 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');
});
но в моем случае ошибка сохраняется.
Кто-нибудь знает, что я могу делать неправильно?