2017-08-23 45 views
0

我有一個非常複雜的數據庫查詢,但我想知道或有可能將其縮短並通過口才更容易嗎? 我的模特和他的分貝是:來自DB的Laravel雄辯

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查詢生成器實現您需要的一切。

請參閱Laravel Docs: Query Builder,它有join methods,where clause methodsselect methods

例如,您可以執行以下操作:

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

這就是你如何創建查詢只是一個例子。鏈接創建查詢所需的許多方法,文檔顯示了許多方法來執行此操作,包括根據需要使用更復雜的聯接。

+0

哇,但這個選擇只適用於ORS在這種情況下?因爲我需要來自另一個連接表的其他列的數據。我可以選擇這個嗎? – wenus

+0

是的,你可以,就像你會做一個sql查詢一樣,前綴表名。這將返回您填充選定列的模型集合。 –

+0

哦,它非常difficut改變我的查詢雄辯! – wenus