У меня есть тестовый сайт, где у меня есть таблицы recipes
, ingredients
и ingredient_uses
. Каждый рецепт «использует» ингредиенты в разных количествах и готовят по-разному (например, нарезанный, нарезанный, фарш, тертый), поэтому таблица ingredient_uses
отслеживает recipe_id
и ingredient_id
с другой переменной информацией.laravel отношения назад
Взаимосвязи выглядеть следующим образом:
Рецепт модели:
public function ingredients()
{
return $this->hasManyThrough('App\Ingredient', 'App\IngredientUse');
}
public function ingredientUses()
{
return $this->hasMany('App\IngredientUse');
}
Ingredient_Use модель:
public function ingredient()
{
return $this->hasOne('App\Ingredient');
}
public function recipe()
{
return $this->belongsTo('App\Recipe');
}
Ингредиент модель:
public function recipe()
{
return $this->belongsToMany('App\Ingredient');
}
Я думал, что хочу получить отношение от рецепта к таблице ингредиентов, используя ингредиенты в качестве среднего стола. Но SQL неправильно:
SELECT `ingredients`.*, `ingredient_uses`.`recipe_id`
FROM `ingredients`
INNER JOIN `ingredient_uses`
ON `ingredient_uses`.`id` = `ingredients`.`ingredient_use_id`
WHERE `ingredient_uses`.`recipe_id` = 1
Это то, что я думаю, что я хочу:
SELECT `ingredients`.*, `ingredient_uses`.`recipe_id`
FROM `ingredients`
INNER JOIN `ingredient_uses`
ON `ingredient_uses`.`ingredient_id` = `ingredients`.`id`
WHERE `ingredient_uses`.`recipe_id` = 1
Есть ли более уместно отношения, которые я должен использовать?
Подождите - я думал, что '' Ingredient_Use' РЕКОМЕНДУЕМЫМ belongsTo' ингредиент? Почему это hasOne? :) –
Я думаю, вам следует использовать ownToMany в модели Ingredient, https://laravel.com/docs/5.3/eloquent-relationships#many-to-many – Borna