2016-06-25 169 views
2

這裏我表遷移(4):多對多在laravel許多關係

餐館:

Schema::create('restaurants', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name'); 
}); 

食物:

Schema::create('foods', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name'); 
}); 

成分:

Schema::create('ingredients', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name'); 
}); 

restaurant_has_foods_with_ingredients:

Schema::create('restaurant_has_foods_with_ingredients', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->unsignedInteger('restaurant_id'); 
     $table->unsignedInteger('food_id'); 
     $table->unsignedInteger('ingredient_id'); 

     $table->foreign('restaurant_id') 
      ->references('id') 
      ->on('restaurants') 
      ->onDelete('cascade'); 

     $table->foreign('food_id') 
      ->references('id') 
      ->on('foods') 
      ->onDelete('cascade'); 

     $table->foreign('ingredient_id') 
      ->references('id') 
      ->on('ingredients') 
      ->onDelete('cascade'); 
}); 

如何定義我的餐廳,食品,配料模型及其關係?

這裏我需要一些例子:

1,所有餐館在他們的餐盤的具體成分。

2-在特定餐廳的特定菜餚的所有成分。

3 - 所有菜餚在餐廳的特定成分。

...

-------------------------編輯後------------ -----------------

我有我自己的解決方案,但我認爲這不是一個好的。

現在在我的餐廳模式,我有兩種實現獲取食物

一拿到餐廳所有的食物:

public function foods() 
{ 
    return $this->belongsToMany('App\Models\Food', 'restaurant_has_foods_with_ingredients') 
     ->groupBy('food_id'); 
} 

而另一個得到的電流restaurunt的具體食品配料

public function foodIngredients(Food $food) 
{ 
    $result = DB::table('restaurant_has_foods_with_ingredients') 
     ->select('restaurant_has_foods_with_ingredients.ingredient_id as ingredient_id') 
     ->where('restaurant_has_foods_with_ingredients.restaurant_id',$this->id) 
     ->where('restaurant_has_foods_with_ingredients.food_id',$food->id) 
     ->get(); 

    $ingredients = array(); 

    foreach ($result as $row) { 
     $ingredients[] = Ingredient::find($row->ingredient_id); 
    } 
    return $ingredients; 
} 

回答

3

基本上它是這樣的:

創建兩個遷移:restaurant_foodfood_ingredient

我們有一個

餐廳模型 - 食品模型 - 配料模型

一個餐飲業可以有很多種類的食物和食物可以在服務餐飲 -​​ >所以我們有一個多對多的關係,這裏

餐廳模式

class Restaurant extends Model 
{ 
    /** 
    * The foods that belong to the Restaurant. 
    */ 
    public function foods() 
    { 
     return $this->belongsToMany('App\Food'); 
    } 

} 

好吧,下一件事

1-正如我們前面提到的,食物類型可以在許多餐館供應,所以我們需要定義反比關係。

2-的食品有許多配料和成分可以在許多類型的食品中使用 - >另一種多對多

食品模型

class Food extends Model 
{ 
    /** 
    * The ingredients that belong to the Food. 
    */ 
    public function restaurants() 
    { 
     return $this->belongsToMany('App\Restaurant'); 
    } 
    /** 
    * The ingredients that belong to the Food. 
    */ 
    public function ingredients() 
    { 
     return $this->belongsToMany('App\Ingredient'); 
    } 

} 

現在也是如此

成分模型

class Ingredient extends Model 
{ 
    /** 
    * The foods that belong to the Ingredient. 
    */ 
    public function foods() 
    { 
     return $this->belongsToMany('App\Food'); 
    } 

} 

好了現在我們所擁有的一切設置,這是如何使用它

添加到關係

$Restaurant = Restaurant::find($id); 
$Restaurant->foods()->attach($food_id); 

從關係中刪除

$Restaurant->foods()->detach($food_id); 

1 - 所有餐館的具體在他們的服務菜餚的成分。

$restaurants = App\Restaurant::with(['foods' => function ($query) { 
    $query->whereHas(['ingredients' => function ($query) { 
     $query->where('name', 'like', 'potato'); 

}])->get(); 

2,所有在特定餐廳的特定菜的成分。

$ingridients = App\Ingredient::whereHas(['foods' => function ($query) { 
    $query->where('name', 'like', 'potato')->whereHas(['restaurant' => function ($query) { 
     $query->where('name', 'like', 'newyork'); 

}])->get(); 

3,所有在餐廳的特定成分的菜餚。具有可變

$foods= App\Food::whereHas(['ingredients' => function ($query) { 
    $query->where('name', 'like', 'potato'); 
}, 
'restaurants' => function ($query) { 
     $query->where('name', 'like', 'newyork'); 
    } 
])->get(); 

變化土豆/紐約,你是好去

我的代碼可能有一些細微的拼寫錯誤或錯誤,但我希望你得到的想法是如何工作

+0

謝謝您的出色答案,但問題在這裏: 兩家餐廳的同一道菜有不同的配料(不同餐廳的料理可能不同) –

+1

你應該提到,起初,生病嘗試和編輯 –

+1

你能否提供我一個預期的例子結果,所以我可以解決並嘗試如何實現它? –