【发布时间】:2016-10-12 22:05:41
【问题描述】:
在预加载时,当关系中的外键为空,因此不匹配任何相关记录时,是否可以避免执行额外的查询?在我的示例中,我有一个 Product 和 User。
Product 归User 所有,但也可以选择由User 编辑。所以我的模型看起来像这样:
class Product extends Model
{
public function user()
{
return $this->belongsTo(User::class);
}
public function editor()
{
return $this->belongsTo(User::class, 'editor_id');
}
}
当一个产品没有被编辑时,它的editor_id属性是NULL。
如果我不急于加载,我知道我可以执行以下操作:
$product = Product::find(1);
if (!is_null($product->editor_id)) {
// Load the relation
}
但是,这对我来说不是一个选项,理想情况下,我希望避免在急切加载时运行额外的、不必要的查询:
Query: select * from `users` where `users`.`id` in (?)
Bindings: [0]
我想知道类似以下的事情是否可行?
public function editor()
{
if (!is_null($this->editor_id)) {
return $this->belongsTo(User::class, 'editor_id');
}
}
执行上述操作时出现此错误:
Call to a member function addEagerConstraints() on a non-object
我猜这是因为不能保证此方法返回 Relation 对象。
谢谢
【问题讨论】:
-
这只是您帖子中的错字还是您实际运行了此代码?因为
USer::class应该是User::class。 -
好吧,你不能那样做,你的关系必须返回一些东西,否则,Laravel 会尝试在 null 上调用一个方法
-
使用 whereHas 条件,也许对你有帮助。
-
大家好,感谢您的回复。 @PeterPan666 - 是的,我知道它需要返回一些东西,这就是我收到错误的原因。 @Imtiaz Pabel - 在这种情况下我将如何使用
whereHas?能举个例子吗?
标签: laravel orm laravel-5 eloquent