2017-08-23 13 views
0

私は非常に複雑なdbクエリを持っていますが、私はそれを短くして雄弁にする方がいいですか? 私のモデルと彼のdbは:Laravel eloquent from DB

class Order extends Model 
{ 
public $timestamps = false; 
public $incrementing = false; 

public function products() 
{ 
    return $this->hasMany(OrderProducts::class); 
} 

public function statuses() 
{ 
    return $this->belongsToMany(OrderStatusNames::class, 'order_statuses', 'order_id', 'status_id'); 
} 

public function actualKioskOrders() 
{ 
return 
    $rows = DB::select("SELECT o.id, o.number, o.name client_name, o.phone, 
    o.email, o.created_at order_date, osn.name actual_status 
    FROM orders o 
    JOIN order_statuses os ON os.order_id = o.id 
    JOIN (SELECT o.id id, MAX(os.created_at) last_status_date FROM orders o 
    JOIN order_statuses os ON os.order_id = o.id GROUP BY o.id) t 
    ON t.id = os.order_id AND t.last_status_date = os.created_at 
    JOIN order_status_names osn ON osn.id = os.status_id 
    WHERE os.status_id != 3"); 
} 

} 

答えて

1

もちろんです。 Laravelクエリービルダーは必要なものすべてを実装します。

join methods,where clause methodsおよびselect methodsを有する。

あなたは、たとえば次の操作を行うことができます

:あなたがクエリを作成する方法の単なる例です

Order::select(['id','number', 'name', 'client_name']) 
->where('status_id', '!=', 3) 
->join('order_statuses', 'order_statuses.order_id, '=', 'orders.id') 
->get() 

。クエリを作成するために必要な多くのメソッドを連鎖させ、必要に応じてより複雑な結合など、さまざまな方法でドキュメントを表示します。

+0

ワウですが、この選択はこの場合のORderにのみ適用されますか?他の結合されたテーブルから他の列のデータも必要とするためです。私はこれを選択してもらえますか? – wenus

+0

はい、SQLクエリでやったように、テーブル名の前に接頭辞を付けることができます。これにより、選択した列で塗りつぶされたモデルのコレクションが返されます。 –

+0

私の質問を雄弁に変えるのは難しいですよ! – wenus