Laravel - 搜索关系,包括 whereHas 中的 null

Posted

技术标签:

【中文标题】Laravel - 搜索关系,包括 whereHas 中的 null【英文标题】:Laravel - Search relation including null in whereHas 【发布时间】:2017-10-17 05:13:29 【问题描述】:

我正在尝试寻找一种方法来搜索这种关系。

所以,我有一对一的关系(用户和用户详细信息,其中一些用户可能没有详细信息)。

所以,问题是......我如何通过用户的详细信息搜索用户,而且没有详细信息的用户也必须包含在结果中。

示例: 表用户: 用户 ID、姓名、电子邮件 - 1 约翰·多伊 johndoe@address.com - 2 理查德·蒂姆 richardtim@address.com - 3 迈克尔·伯德 michaelbird@address.com

表用户详细信息: ID、user_id、状态 - 1, 1, 加利福尼亚 - 2, 2, 纽约

现在...我想从加利福尼亚获得所有用户,以及所有没有状态的用户(在上述情况下,结果应该是 John Doe 和 Michael Bird

这是用户模型中的关系:

public function details()

    return $this->belongsTo('App\UserDetails', 'user_id', 'user_id');

搜索功能是:

$users = $users->whereHas('details', function($query) use $state 
    $query->where('state', $state);
);

请记住,我必须使用 eloquent / 查询构建器的实例来执行此操作,我无法使用联接或原始查询。

在这种情况下,我想获取来自加利福尼亚的所有用户和所有非相关用户,但查询返回/搜索仅相关用户/user_details...

那么,有人可以帮助我吗? 谢谢

更新:

我正在尝试这样:

$users = new User();
$users = $users->doesntHave('user_details')->orWhereHas('user_details', function($query) use($state) 
                $query->whereIn('state', $state);
            );
$users->where('created_at', '>=', $start_date);
$users->where('created_at', '<=', $end_date);

【问题讨论】:

当你编辑你的问题时添加编辑:你编辑的任何东西!! 【参考方案1】:

您可以将doesntHaveorWhereHas 结合使用来创建所需的查询:

User::doesntHave('details')->orWhereHas('details', function($query) 
    $query->where('state', '=', $state);
)->where('users.created_at', '>=', $start_date)
    ->where('users.created_at', '<=', $end_date)
    ->get();  

【讨论】:

问题是我必须使用模型/查询构建器来做到这一点,在我的情况下,我无法使用连接或原始查询......(我将编辑我的问题以建议我必须使用 eloquent/query builder 功能) 谢谢,您的解决方案有效,但现在我在合并用户表中的列时遇到问题...如果我尝试从加利福尼亚搜索用户,则查询生成器会忽略用户表中的 created_at。 . 有没有办法在我使用没有功能时将用户搜索和 user_details 结合起来?谢谢 你能用你正在尝试的代码更新你原来的问题吗? 我编辑了我原来的问题,你可以看到我的代码...谢谢。 是的,在我的情况下,我使用 whereDoesntHave 而不是 doesntHave,现在一切正常。感谢并为我迟到的回复感到抱歉。

以上是关于Laravel - 搜索关系,包括 whereHas 中的 null的主要内容,如果未能解决你的问题,请参考以下文章

Php 变量未传递到 whereHas 函数 - Laravel Eloquent

Laravel:具有 whereHas 和多对多关系的全局范围

Laravel 多个 whereHas 关系标准

Laravel whereHas 跨两个独立的数据库

WhereHas Laravel 中的关系计数条件是啥

Laravel 递归 whereHas on BelongsToMany 关系