2017-06-01 2 views
0

Ich habe eine Abfrage in mysql erstellt, die eine Unterabfrage verwendet. Ich habe versucht, diese Abfrage in Laravel 4.2 so zu reproduzieren:Wie man Tabellen verbindet, die aus Unterabfragen in Laravel resultieren 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'); 
          }); 

Wenn ich $store_booklets_products->get() tun es gibt mir ein

SQLSTATE[HY000]: General error: 2031

Obwohl, wenn ich $store_booklets_products->toSql() tun gibt es die richtige SQL-Abfrage.

Ich kann nicht herausfinden, was mit Abfrage falsch ist. Ich hatte ein ähnliches Problem in Laravel 5, bevor das mit der Verwendung der Methode where innerhalb der Unterabfrage zu tun hatte, löste ich es mit whereRaw stattdessen. Aber das scheint in Laravel nicht zu funktionieren 4.2.

In this Frage bezeichnet, dass man das Verfahren mergeBindings($subqueryQueryBuilder) verwenden soll, wenn aus einer Tabelle aus einer Unterabfrage resultierenden Auswahl und ich versuchte, diesen

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

aber in meinem Fall bleibt der Fehler.

Hat jemand eine Idee von dem, was ich falsch machen könnte?

Antwort

0

Dieses Problem wurde tatsächlich mit den Bindungen des Abfrage-Generators verwandt. Da ich den Variable vorging $storeId an die Unterabfrage, wenn die Abfrage der Montage hatte ich die Methode addBinding vorbei, um es wie dies die $storeId, hinzuzufügen:

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

Nach this die Klasse Grammar die Bindungen bei der Erstellung zurückgesetzt daher die Notwendigkeit, es wieder anzubringen.