標題可能會誤導,但這裏是問題: 我有一個食譜模型和主題周模型(橙色食譜周,素食周等)。現在,我需要將一個配方與一週的每一天相關聯。 我想要的是類似Week::find(1)->monday
Laravel雄辯的命名關係
我想通過在周模型中創建7個關係(每天一個)來實現這一點,名爲星期一,星期二等,但它聽起來很冗長。 另一種方式是創建一個多對多的關係,在數據透視表中添加一天,但之後我不認爲我可以直接訪問「純素星期一的食譜」。
您認爲如何?有沒有人知道更好的方法來實現這一目標?
標題可能會誤導,但這裏是問題: 我有一個食譜模型和主題周模型(橙色食譜周,素食周等)。現在,我需要將一個配方與一週的每一天相關聯。 我想要的是類似Week::find(1)->monday
Laravel雄辯的命名關係
我想通過在周模型中創建7個關係(每天一個)來實現這一點,名爲星期一,星期二等,但它聽起來很冗長。 另一種方式是創建一個多對多的關係,在數據透視表中添加一天,但之後我不認爲我可以直接訪問「純素星期一的食譜」。
您認爲如何?有沒有人知道更好的方法來實現這一目標?
如果你是存儲在配方表中,這樣的工作日,一個配方將永遠只能屬於一個單一的一天,在任何時候,那麼你就可以創建這樣在你Week
模型的關係和方法:
public function recipes()
{
return $this->hasMany('Recipe');
}
public function recipesForDay($day)
{
return $this->recipes()->where('day',$d);
}
...然後通過調用Week::find(1)->recipesForDay('monday')->first();
但是,如果你的Recipe
表不存儲任何相關信息(每天訪問即不存在week_id
和day
在recipes
列,那麼你將需要一箇中間的recipe_week
數據透視表。數據透視表應該是這樣的:
recipe_week
------------------------------------
recipe_id (integer/unsigned)
week_id (integer/unsigned)
day (integer, enum, or string)
在你Week
模型(Week.php):
public function recipes()
{
return $this->belongsToMany('Recipe')->withPivot('day');
}
public function recipesByDay()
{
return $this->recipes->keyBy('pivot.day');
}
public function recipeForDay($day)
{
return $this->recipes()->where('day', $day)->first();
}
(可選)在Recipe
模型(Recipe.php):
public function weeks()
{
return $this->belongsToMany('Week')->withPivot('day');
}
使用此設置,您可以使用attach
使連接食譜和周之間的關係,指定一天作爲一個額外的屬性。例如,要指定配方#9在週一的食譜一週#1:
Week::find(1)->recipes()->attach(9, array('day' => 'monday'));
...它創建的關係,同時留下您的recipes
表不變。
然後,要獲得某一天的一個配方,你可以查詢:
$recipe = Week::find(1)->recipeforDay('wednesday');
要獲得某一週的所有食譜,並通過他們的一天訪問,而不必遍歷它們:
$recipes = Week::find(1)->recipesByDay();
var_dump($recipes['monday']->name);
var_dump($recipes['monday']->ingredients);
// etc...
我不想修改配方模型。無論如何,我理解你的方法,並且可以修改它以不觸碰食譜表。 但是,有一點:我如何急切地加載整整一週?我認爲這需要7 + 1個查詢來獲得整個星期的食譜。 – lucabartoli 2014-11-03 22:50:02
這種方法假定你在'Recipe'模型中存儲'week_id'和'day',其中'week_id'是連接到'Week'的外鍵。如果是這樣,那麼你可以通過'Week :: with('recipes') - > find(1) - > get();來加載整個星期。但是,如果沒有關係信息存儲在'Recipe'表中,則需要一箇中間數據透視表來連接這兩個表。該數據透視表將包括一個額外的'日'列。 – damiani 2014-11-03 23:03:48
是的,數據透視表是我考慮的第一種方法。我也可以在整整一週內加載所有食譜。 我可以從一週收集'$ recipe-> pivot-> day'的單一食譜來訪問這一天,但我不知道是否可以直接通過一天檢索食譜,而沒有騎自行車發生整個集合(就像在一個索引數組)。 – lucabartoli 2014-11-03 23:15:15
是否要使用「 - > monday」,就好像它運行查詢一樣?好。我想你可以使用Scope(http://laravel.com/docs/4.2/eloquent#query-scopes)。關於其他問題......現在無法幫助。 – klauskpm 2014-11-03 15:12:52
那麼,範圍是一個很好的觀點,但並不完全是我要找的。 「 - > monday」是我需要訪問食譜的一個示例,但我認爲最好能夠澄清真正的問題: 我將加載整整一週的食譜(例如熱切地加載一週食譜),那麼我也想處理一種合理的方式來根據當天檢索每一個,而不用查詢7次。 – lucabartoli 2014-11-03 15:42:30
你不是在說你想如何配合週末的食譜。這不是你在這裏需要的範圍,而是一些從相關食譜集合中獲取給定食譜的方法,這完全取決於你。 – 2014-11-03 16:06:39