Laravel HasManyThrough具有3向数据透视表

时间:2016-05-09 13:52:46

标签: php mysql laravel eloquent

我有以下型号

配方

public function ingredientRecipeUnits()
{
    return $this->hasMany(IngredientRecipeUnit::class);
}

成分

public function ingredientRecipeUnits()
{
    return $this->hasMany(IngredientRecipeUnit::class);
}

单元

public function ingredientRecipeUnits()
{
    return $this->hasMany(IngredientRecipeUnit::class);
}

和一个连接所有三个的数据透视表(在它自己的模型中):

IngredientRecipeUnit

public function ingredient()
{
    return $this->belongsTo(Ingredient::class);
}

public function recipe()
{
    return $this->belongsTo(Recipe::class);
}

public function unit()
{
    return $this->belongsTo(Unit::class);
}

我想通过配料模型获取所有食谱。

为此,我建立了以下关系:

public function recipes() {
    return $this->hasManyThrough(
        Recipe::class,      
        IngredientRecipeUnit::class, 
        'ingredient_id', 
        'id'
    );
}

这会生成 不正确的 查询,如下所示

select * from `recipes` 
inner join `ingredient_recipe_units` 
on `ingredient_recipe_units`.`id` = `recipes`.`id` 
where `ingredient_recipe_units`.`ingredient_id` = ?

虽然实际上查询应该如下所示。 (注意第3行id - > recipe_id的微妙变化

select * from 'recipes'
inner join `ingredient_recipe_units`
on `ingredient_recipe_units`.`recipe_id` = `recipes`.`id` 
where `ingredient_recipe_units`.`ingredient_id` = ?

除了向Eloquent仓库发送拉取请求以添加额外的参数或使用原始SQL之外;有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

这最终成为我想出关系的方式的错误,只需将个别相关模型中的belongsToMany直接定义到IngredientRecipeUnit表即可解决。

前:成分模型

public function recipes() {
    return $this->belongsToMany(Recipe::class, 'ingredient_recipe_units');
}

根据您的型号,您可能会添加多个相同的成分或单位,在这种情况下,您应该使用本能方法标记查询。

像这样:

public function recipes() {
    return $this->belongsToMany(Recipe::class, 'ingredient_recipe_units')->distinct();
}

哪个correclty会生成以下所需的查询:

select distinct * from `recipes` 
inner join `ingredient_recipe_units` 
on `recipes`.`id` = `ingredient_recipe_units`.`recipe_id` 
where `ingredient_recipe_units`.`ingredient_id` = ?