2014-11-03 80 views
0

標題可能會誤導,但這裏是問題: 我有一個食譜模型和主題周模型(橙色食譜周,素食周等)。現在,我需要將一個配方與一週的每一天相關聯。 我想要的是類似Week::find(1)->mondayLaravel雄辯的命名關係

我想通過在周模型中創建7個關係(每天一個)來實現這一點,名爲星期一,星期二等,但它聽起來很冗長。 另一種方式是創建一個多對多的關係,在數據透視表中添加一天,但之後我不認爲我可以直接訪問「純素星期一的食譜」。

您認爲如何?有沒有人知道更好的方法來實現這一目標?

+1

是否要使用「 - > monday」,就好像它運行查詢一樣?好。我想你可以使用Scope(http://laravel.com/docs/4.2/eloquent#query-scopes)。關於其他問題......現在無法幫助。 – klauskpm 2014-11-03 15:12:52

+0

那麼,範圍是一個很好的觀點,但並不完全是我要找的。 「 - > monday」是我需要訪問食譜的一個示例,但我認爲最好能夠澄清真正的問題: 我將加載整整一週的食譜(例如熱切地加載一週食譜),那麼我也想處理一種合理的方式來根據當天檢索每一個,而不用查詢7次。 – lucabartoli 2014-11-03 15:42:30

+0

你不是在說你想如何配合週末的食譜。這不是你在這裏需要的範圍,而是一些從相關食譜集合中獲取給定食譜的方法,這完全取決於你。 – 2014-11-03 16:06:39

回答

0

如果你是存儲在配方表中,這樣的工作日,一個配方將永遠只能屬於一個單一的一天,在任何時候,那麼你就可以創建這樣在你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_iddayrecipes列,那麼你將需要一箇中間的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... 
+0

我不想修改配方模型。無論如何,我理解你的方法,並且可以修改它以不觸碰食譜表。 但是,有一點:我如何急切地加載整整一週?我認爲這需要7 + 1個查詢來獲得整個星期的食譜。 – lucabartoli 2014-11-03 22:50:02

+0

這種方法假定你在'Recipe'模型中存儲'week_id'和'day',其中'week_id'是連接到'Week'的外鍵。如果是這樣,那麼你可以通過'Week :: with('recipes') - > find(1) - > get();來加載整個星期。但是,如果沒有關係信息存儲在'Recipe'表中,則需要一箇中間數據透視表來連接這兩個表。該數據透視表將包括一個額外的'日'列。 – damiani 2014-11-03 23:03:48

+0

是的,數據透視表是我考慮的第一種方法。我也可以在整整一週內加載所有食譜。 我可以從一週收集'$ recipe-> pivot-> day'的單一食譜來訪問這一天,但我不知道是否可以直接通過一天檢索食譜,而沒有騎自行車發生整個集合(就像在一個索引數組)。 – lucabartoli 2014-11-03 23:15:15