Laravel或者没有与hasMany合作

时间:2015-07-23 09:58:15

标签: php laravel-4

我有以下代码:

class Ingredient extends Eloquent
{
    public function units()
    {
        return $this->hasMany('IngredientUnit')
                    ->orWhere('ingredient_id', '=', -1);
    }
}

我希望查询如下:

select * from `ingredient_units` where `ingredient_id` = '-1' OR `ingredient_units`.`ingredient_id` in (...)

相反,我得到:

select * from `ingredient_units` where `ingredient_id` = '-1' and `ingredient_units`.`ingredient_id` in (...)

为什么它使用AND运算符代替OR,当我使用orWhere()?

更新1:

第二个问题是如何才能得到我所期待的查询?

更新2:

我想使用eagerloading来实现

1 个答案:

答案 0 :(得分:0)

当您通过模型上的关系获取对象集合时,始终包含关系约束,因此 AND 。它非常有意义,否则您可以获得与 $ model 无关的$ model->单位对象。

我可以看到你在这里尝试实现的目标 - 获取与 $ model 相关的单位以及与任何模型无关的单位。您可以通过在模型中添加以下方法来实现它:

public function getAllUnits() {
  $genericUnits = IngredientUnit::whereIngredientId(-1);
  return $this->units()->union($genericUnits)->get();
}

OR

public function getAllUnits() {
  return IngredientUnit::whereIn('ingredient_id', [$this->id, -1])->get();
}

这里唯一的问题是它不会被急切的加载逻辑使用,但会导致您想要返回单位的每个模型的单独查询。但是如果你总是为单个模型获取它,它就不会成为问题。

一个建议:在ingredient_id中存储 NULL 而不是-1。这样您就可以使用外键约束