如何在 Laravel 模型关系中使用“where not”?

Posted

技术标签:

【中文标题】如何在 Laravel 模型关系中使用“where not”?【英文标题】:How to use "where not" in a Laravel Model Relationship? 【发布时间】:2016-06-20 11:28:53 【问题描述】:

我有一个类似的用户表:

=== users ===
id: int (PK)
name: string
is_coach: bool
...

还有一个教练请求表,类似于:

=== coach_requests ===
id: int (PK)
student_id: int(FK => users.id)
coach_id: int(FK => users.id)
...

我也有相应的 Laravel 模型(即UserCoachRequest)。

User 模型中,我希望创建一个方法,使得给定指定用户,返回所有用户is_coach = true,除了:

他/她自己和 在coach_requests 表中已与该人匹配为教练的用户。

例如考虑以下示例数据:

用户

(1, "A", false)
(2, "B", true)
(3, "C", true)
(4, "D", true)
(5, "E", true)
(6, "F", true)

coach_requests

(1, 2, 3)
(2, 2, 4)
(3, 3, 2)
(4, 3, 6)
(5, 4, 5)
(6, 4, 6)
(7, 5, 6)
(8, 6, 5)
(9, 1, 4)

现在如果我是用户:

id 1(即用户“A”),返回用户id:2、3、5和6 id 2,返回用户id:5、6 id 3,返回用户id:4、5 id 4,返回用户id:2、3 id 5,返回用户id:2、3、4 id 6,返回用户id:2、3、4

如何使用 Laravel 做到这一点?

到目前为止,我只有这个:

public function scopeOfFreeCoaches($query) 
    return $query->where([
        'is_coach' => true,
    ]);

不多!

非常感谢!

【问题讨论】:

在这种情况下,原始查询可能是最简单的方法,因为它是一种自定义:laravel.com/docs/5.1/database 我什至不确定这个原始的会是什么 【参考方案1】:

这是我头顶上的原始查询:

SELECT u.id FROM users AS u
WHERE u.is_coach = true
AND u.id <> ’$userId’
AND u.id NOT IN(
    SELECT student_id FROM coach_requests
    WHERE coach_id = ’$userId’
)

快速完成且未经测试,因此您可能需要稍作更改。

【讨论】:

【参考方案2】:

感谢@purpleninja 原始查询,我设法弄清楚如何使用 Laravel 做到这一点:

public function getPotentialCoaches()

    return
        User::where('is_coach', true)
        ->where('id', '<>', $this->id)
        ->whereNotIn('id', function ($query) 
            $query->select('coach_id')
                ->from('coach_requests')
                ->where('student_id', $this->id);
        )
        ->get();

【讨论】:

以上是关于如何在 Laravel 模型关系中使用“where not”?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 雄辩的关系中使用 where 子句

Laravel Eloquent 关系有很多错误:在 where 上使用时调用未定义的方法

如何在 switch 语句中使用 laravel 模型运行多个 Where 子句

Laravel Eloquent发现并返回两种不同的类型?

Laravel 6:如何将多个 where 子句添加到关系中

Laravel 查询模型关系