Eloquent 将可选条件添加到外键为 null 的 hasMany
Posted
技术标签:
【中文标题】Eloquent 将可选条件添加到外键为 null 的 hasMany【英文标题】:Eloquent add optional condition to hasMany where foreign key is null 【发布时间】:2021-07-02 03:52:03 【问题描述】:你如何在一个有说服力的关系中添加一个可选/或条件?
例如,我希望所有用户 cmets 或外键 (user_id) 为 NULL。
select * from `comments` where (`user_id` is null OR `comments`.`user_id` in (1, 2, 3)) AND `status` = 1
在用户关系中添加orWhereNull
public function comments()
return $this->hasMany(Comments::class)->orWhereNull('user_id');
但是 Laravel 正在运行:
select * from `comments` where `user_id` is null and `comments`.`user_id` in (1, 2, 3)
很惊讶之前没有人问过这个问题,我发现类似的事情是这样的: https://laracasts.com/discuss/channels/eloquent/eloquent-orwherenull-when-where-has-no-results
我试过了,但它需要模型而不是查询生成器。
return $this->where(function ($query)
return $query::hasMany(Comment::class)->orWhereNull('user_id');
);
我正在使用预先加载来获取用户列表的 cmets。
$users = User::with('comments')->where('active', 1)->paginate(10);
【问题讨论】:
【参考方案1】:您可以根据自己的需要进一步优化,只需提供关于查询的想法
$users = User::with('comments', function($query)
$query->where('user_id', '=', null)->where('status', '1');
)->paginate(10);
【讨论】:
不要这样做where('user_id', '=', null)
有一个现有的方法是 whereNull('user_id')
。以上是关于Eloquent 将可选条件添加到外键为 null 的 hasMany的主要内容,如果未能解决你的问题,请参考以下文章