mysql - 如何连接 Laravel 4.2 中子查询产生的表

标签 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]: 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);

根据thisGrammar 在编译期间重置绑定(bind),因此需要重新附加它。

关于mysql - 如何连接 Laravel 4.2 中子查询产生的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44312897/

相关文章:

mysql - 两点之间的距离。东西+南北

laravel - 如何在 Laravel 5.3 中进行动态查询?

Laravel:根据嵌套关系的字段对查询结果进行排序

php - 如何用 eloquent "with"选择特定的列

mysql - ASP.net - VB NET 如何计算 SQL 查询的行数

php - 根据字段值排序数据

php - Mysql比较日期时间

mysql - Laravel 查询生成器中的 SQL 查询 GROUP BY 问题

mysql - 我的查询在 mysql 中工作,但不适用于 laravel eloquent

php - 如何在 Laravel-4.2 及以上版本中设置调度程序