Название может вводить в заблуждение, но вот проблема:
У меня есть модель «Рецепт» и тематическая модель «Неделя» (неделя «Оранжевые рецепты», «Веганская неделя» и т. Д.). Теперь мне нужно связать один рецепт с каждым днем недели.
Я хочу иметь что-то вроде Week::find(1)->monday
Я думал достичь этого путем создания 7 отношений (по одному в день) в модели Week с именами понедельник, вторник и т. Д., Но это звучит многословно.
Другим способом может быть создание дня добавления отношений «многие ко многим» в сводной таблице, но тогда я не думал, что смогу получить прямой доступ к «рецепту веганской недели».
Как вы думаете? Кто-нибудь знает лучший способ добиться этого?
Если вы сохраняете день недели в таблице рецептов — так что рецепт будет когда-либо принадлежать только одному дню в любое время — тогда вы можете создать отношение и метод в своем 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...
Других решений пока нет …