我在 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]: General error: 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');
});
但就我而言,错误仍然存在。
有人知道我可能做错了什么吗?
最佳答案
这个问题确实与查询生成器的绑定(bind)有关。由于我将变量 $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
在编译期间重置绑定(bind),因此需要重新附加它。
关于mysql - 如何连接 Laravel 4.2 中子查询产生的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44312897/