2017-06-01 120 views
0

我在使用子查詢的mysql中創建了一個查詢。我試圖重現此查詢在Laravel 4.2這樣的:如何在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'); 
            }); 

但在我的情況下,錯誤仍然存​​在。

有沒有人知道我可能會做錯什麼?

回答

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

根據thisGrammar在編譯期間復位綁定因此需要重新附加它。