Именованные отношения в Laravel Eloquent

Название может вводить в заблуждение, но вот проблема:
У меня есть модель «Рецепт» и тематическая модель «Неделя» (неделя «Оранжевые рецепты», «Веганская неделя» и т. Д.). Теперь мне нужно связать один рецепт с каждым днем ​​недели.
Я хочу иметь что-то вроде Week::find(1)->monday

Я думал достичь этого путем создания 7 отношений (по одному в день) в модели Week с именами понедельник, вторник и т. Д., Но это звучит многословно.
Другим способом может быть создание дня добавления отношений «многие ко многим» в сводной таблице, но тогда я не думал, что смогу получить прямой доступ к «рецепту веганской недели».

Как вы думаете? Кто-нибудь знает лучший способ добиться этого?

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_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...
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]