отношения laravel в обратном направлении

#php #laravel #relationship

#php #ларавель #отношения

Вопрос:

У меня есть тестовый сайт, где у меня есть recipes ingredients таблицы , ingredient_uses , и. В каждом рецепте «используются» ингредиенты в разных количествах и приготовлены по-разному (например, нарезанные, нарезанные, измельченные, натертые на терке), поэтому в ingredient_uses таблице отслеживается recipe_id и ingredient_id другая переменная информация.

Отношения выглядят примерно так:

Модель рецепта:

 public function ingredients()
{
    return $this->hasManyThrough('AppIngredient', 'AppIngredientUse');
}

public function ingredientUses()
{
    return $this->hasMany('AppIngredientUse');
}
 

Модель ингредиента_использования:

 public function ingredient()
{
    return $this->hasOne('AppIngredient');
}

public function recipe()
{
    return $this->belongsTo('AppRecipe');
}
 

Модель ингредиента:

 public function recipe()
{
    return $this->belongsToMany('AppIngredient');
}
 

Я думал, что мне нужна hasManyThrough связь между рецептом и таблицей ингредиентов, используя ingredient_uses в качестве средней таблицы. Но 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
 

Есть ли более подходящие отношения, которые я должен использовать?

Комментарии:

1. Подождите, я подумал Ingredient_Use , что должен belongsTo быть ингредиент? Почему это hasOne? 🙂

2. я думаю, вам следует использовать belongsToMany в модели ингредиентов, laravel.com/docs/5.3/eloquent-relationships#many-to-many

Ответ №1:

Во-первых, вам не нужна модель Ingredient_Use. Примеры моделей:

 class Ingredient extends Model
{
    /**
     * @var string
     */
    protected $table = 'ingredients';

    /**
     * @return IlluminateDatabaseEloquentRelationsBelongsToMany
     */
    public function recipes()
    {
        return $this->belongsToMany(Recipe::class, 'recipes_ingredients', 'ingredient_id');
    }
}




class Recipe extends Model
{
    /**
     * @var string
     */
    protected $table = 'recipes';

    /**
     * @return IlluminateDatabaseEloquentRelationsBelongsToMany
     */
    public function ingredients()
    {
        return $this->belongsToMany(Ingredient::class, 'recipes_ingredients', 'recipe_id')->withPivot('additional', 'fields');
    }
}
 

Пример доступа к дополнительным полям

 $recipe->pivot->additional;
 

Ответ №2:

в модели ингредиентов

 class Ingredient extends Model
{


    public function recipe(){

          return $this->belongsToMany(Recipe::class, 'ingredient_uses', 'ingredient_id', 'recipe_id');
    }

}
 

другие модели будут пустыми, что означает, что внутри модели рецепта и модели ингредиентов не будет никакой функции.

вы можете посмотреть документацию об этом https://laravel.com/docs/5.3/eloquent-relationships#many-to-many