【问题标题】:How to join tables resulting from subqueries in Laravel 4.2如何在 Laravel 4.2 中连接子查询产生的表
【发布时间】: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-&gt;get() 时,它给了我一个

SQLSTATE[HY000]:一般错误:2031

不过,如果我执行$store_booklets_products-&gt;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


    【解决方案1】:

    这个问题确实与查询生成器的绑定有关。由于我将变量$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 类在编译期间重置绑定,因此需要重新附加它。

    【讨论】:

      猜你喜欢
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2020-03-12
      • 2017-03-29
      相关资源
      最近更新 更多