我在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');
});
但在我的情况下,错误仍然存在。
有没有人知道我可能做错了什么?
答案 0 :(得分:0)
此问题确实与查询构建器的绑定有关。由于我将变量$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);
根据this,类Grammar
在编译期间重置绑定,因此需要重新附加它。