【发布时间】:2017-11-02 22:03:03
【问题描述】:
我在 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.
在this 中提到的问题是,从子查询产生的表中进行选择时应该使用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');
});
但在我的情况下,错误仍然存在。
有人知道我可能做错了什么吗?
【问题讨论】:
标签: mysql laravel-query-builder laravel-4.2