如何在Laravel 4.2中连接由子查询生成的表

时间:2017-06-01 16:34:58

标签: mysql laravel-query-builder 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。

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');
                                    });

但在我的情况下,错误仍然存​​在。

有没有人知道我可能做错了什么?

1 个答案:

答案 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在编译期间重置绑定,因此需要重新附加它。