2016-12-28 110 views
3

讓說我有一個像下表:如何讓Laravel 5擁有多層hasMany()關係?

order 
order_id | customer_name | delivery_address   
1  | David   | ABC Road, DEF district 
...........Some other record .............. 

order_dish 
order_id | dish_id | dish_name 
1  | 1  | chicken wing 
1  | 2  | meat pie 
1  | 3  | onion ring 
...........Some other record .............. 

dish_ingredient 
dish_id | ingredient 
1  | chicken wing 
1  | salt 
1  | oil 
2  | pork meat 
2  | flour 
3  | onion 
...........Some other record .............. 

在Laravel 5,如果我想獲得一個訂單的所有的菜,我可以這樣做:

$order = Order::hasMany('App\OrderDish', 'order_id')->get(); 

有沒有一種方法可以讓我在一行中獲得訂單所需的全部成分?

+1

檢查HTTPS ://laravel.com/docs/5.3/eloquent-relationships#has-many-through,這應該可以解決你的問題。 – shoieb0101

+0

您需要在Order模型中定義hasMany OrderDish。此外,orderDish模型應該有一個hasMany dishIngredients(如果我理解正確) –

+0

您發佈的代碼不會讓你「所有菜餚的訂單」,因爲你沒有在任何地方傳遞訂單ID –

回答

0

是的。 「多對多」關係爲通過中間關係訪問遠程關係提供了便捷的途徑。你可以用你的模型的hasManyThrough()方法來定義它。

首先,定義的關係在你的訂購型號:

class Order extends Model { 
    public function ingredients() { 
    return $this->hasManyThrough('App\DishIngredient', 'App\OrderDish', 'order_id', 'dish_id'); 
    } 
} 

有了限定的這樣的關係,你就可以得到食材給定的順序使用:

$ingredients = $order->ingredients;