#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