我有以下代码:
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来实现
答案 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。这样您就可以使用外键约束。