2017-03-10 4 views
0

ich mit Laravel und Eloquent ORM arbeitete und nach der Entwicklung Controller, Modell und Ansicht für meinen Tisch brauche ich Agregate Informationen zu extrahieren, aber ich weicht nicht, herauszufinden, ist der beste Weg, oder die sauberste " Laravel "Weg, das zu tun.Laravel Gruppe mit Elequent Modell

Ich habe eine db Tabelle wie in diesem Beispiel:

Schema::create('order_items', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->timestamps(); 
     $table->integer('order_id')->unsigned(); 
     $table->foreign('order_id')->references('id')->on('orders')->onDelete('cascade'); 
     $table->string('item_description'); 
     $table->integer('item_qty'); 
     $table->status('item_status'); 
    }); 

Die Detail Daten können wie:

2 2017-02-28 12:48:07 2017-02-28 12:48:31 1 ProductB 2 NEW 
4 2017-02-28 12:48:17 2017-02-28 12:48:17 1 ProductC 3 NEW 
29 2017-03-10 10:49:47 2017-03-10 10:49:47 1 ProductC 23 CLOSED 
40 2017-03-10 10:49:47 2017-03-10 10:49:47 1 ProductB 2 SHIPPED 
1 2017-02-28 11:04:28 2017-02-28 11:29:10 3 ProductA 1 NEW 
28 2017-03-10 10:49:47 2017-03-10 10:49:47 3 ProductB 22 CLOSED 
39 2017-03-10 10:49:47 2017-03-10 10:49:47 3 ProductA 1 SHIPPED 
5 2017-02-28 14:36:54 2017-02-28 14:36:54 6 ProductD 4 NEW 
6 2017-02-28 14:37:01 2017-02-28 14:37:01 6 ProductD 5 NEW 
30 2017-03-10 10:49:47 2017-03-10 10:49:47 6 ProductD 24 CLOSED 
41 2017-03-10 10:49:47 2017-03-10 10:49:47 6 ProductC 3 SHIPPED 

Im Controller ich einen Bereich

verwenden
public function home() 
{ 
    $onlynew = Orderitem::onlynew(); 
    return view('home', compact('onlynew ')); 
} 

Das Modell ist

public function scopeonlynew ($query) { 
return \DB::select('SELECT item_description, sum(item_qty) qty 
        FROM order_items 
        WHERE item_status = ? 
        GROUP BY item_description',['NEW']); 
} 

Nach Ansicht I-Daten auf diese Weise zugreifen können

<div class="row"> 
<ul> 
    @foreach ($onlynew as $newitem) 
    <li>{{$newitem->item_description}} - {{$newitem->qty}}</li> 
    @endforeach 
</ul> 
</div> 

Ist es möglich, eine Syntax wie die folgende Beispiel oder für diese Art der Abfrage zu verwenden das Rahmenwerk erlaubt nicht, den Erbauer zu benutzen?

return $query->where('item_status', '=', 'NEW') 
     ->sum('item_qty') 
     ->groupBy('item_description') 
     ->orderBy('item_description'); 

Vielen Dank für jede Art von Hilfe oder Anregung.

Antwort

2

Wenn Sie die sum() Methode es die Abfrage ausführt und nur die Summe zurückgibt. Was Sie hier wollen, ist die Summe Summe und die Beschreibung zu bekommen, so dass Sie die select selbst erstellen müssen. So könnte der "Laravel" Weg aussehen.

Controller:

public function home() 
{ 
    $onlynew = Orderitem::onlyNew()->get(); 
    return view('home', compact('onlynew ')); 
} 

Modell:

public function scopeOnlyNew($query) 
{ 
    return $query->where('item_status', '=', 'NEW') 
     ->selectRaw('sum(item_qty) as qty, item_description') 
     ->groupBy('item_description') 
     ->orderBy('item_description'); 
} 

Beachten Sie die Abfragebereich ein wenig anders aufgebaut ist. Query scopes are designed to allow you to group commonly use query constraints into a single method dann wiederverwenden diese Einschränkungen mit jeder Frage, die Sie erstellen. Sie sollten immer dasselbe Abfrageobjekt zurückgeben, das sie erhalten, anstatt ein neues Objekt wie DB::select() zu erstellen.

+0

** selectRaw ** war genau das, was ich suchte und die Dokumentation, die ich vermisse. Vielen Dank. – AlexMI

0

Ich persönlich bevorzuge die DB :: table-Anweisung.

public function scopeonlynew() { 
    return DB::table('order_items')->where('item_status', '=','NEW')->get(); 
} 

Lassen Sie mich wissen, ob dies für Sie funktioniert!

+0

Ich stimmen Sie zu, dass die DB :: table-Anweisung, die Sie Werke vorschlagen, aber dies ist ein „Filter“, das ein detailliertes Ergebnis zurück, wie kann Gruppe und Aggregat? Vielen Dank. – AlexMI

+0

gibt DB :: table ('order_items') zurück -> wo ('item_status', '=', 'NEW')> groupBy ('item_qt') -> having ('account_id', '>', 5); –

+0

Dies ist jedoch kein Bereich. Bereiche sollten das angegebene $ query-Objekt zurückgeben. Dies wird nur eine neue Abfrage erstellen. Wenn Sie also 'Orderitem :: where ('item_description', '=', 'ProductA') -> onlynew()' versucht haben, würde es nicht wie erwartet funktionieren. Es würde nur ALLE neuen Artikel zurückgeben, anstatt nur neue productA-Artikel. – jfadich