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的主要内容,如果未能解决你的问题,请参考以下文章

JDBCTemplate + MySQL 主键到外键

sql 关联查询外键为空的情况

EF 外键为 NULL

MySQL没有结果,因为外键为NULL

Hibernate多对一更新外键为null

使用 Swift 的 Encodable 将可选属性编码为 null 而无需自定义编码