如何获取没有关联的模型记录?

4

Laravel中是否有一种“whereDoesNotHave”方法来获取没有关联的记录?

我有一个查询,检查用户是否有团队或他们的名字是David,但不知道如何编写这个查询:

User::where(function($query){ 
     $query->where('name', 'David')->orWhere($this->teams->count() , '<' , 1);
})
  ->get();

我需要类似于这样的东西。 更新 忘记提到了 - 关系是多对多的,用户可以有多个团队。
2个回答

4
您可以使用doesntHave()方法:
$users = User::doesntHave('teams')->orWhere('name', 'David')->get();

如果您需要进行“OR”操作,则第二个参数可以让您更改它:

$users = User::where('name', 'David')->doesntHave('teams', 'or')->get();

2
在您的“用户模型”中,可能存在与“团队模型”的关联。
// in User Model
public function team()
{
    return $this->belongsTo('App\Team', 'team_id');
}

这将是逻辑上将用户与团队关联的默认方式。
如果是这种情况,那么您的“users”表中应该有一个“team_id”字段。所以你只需要查找team_id字段为空的用户。
代码如下:
$q = User::where('team_id',null)->orWhere('name','David')->get();

编辑: 如果你的关系是多对多(每个用户可能属于多个团队),你应该使用 Eloquent 的 has() 方法;
$users = User::has('teams', '0')->orWhere('name', 'David')->get();

注意: 正如patricus他的答案中指出的那样;
使用Eloquent方法doesntHave()也可以工作,并且在这种情况下似乎更合适。

has()函数的第二个参数是运算符,而不是数字。应该写成has('teams', '<', 1) - patricus
@patricus 我认为并非如此。我发现 has() 的参数类似于 where() 。如果提供两个参数,则自动检查相等性:has('arg1', 'arg2') = has('arg1,'=','arg2'). 但是,如果您提供三个参数,则第二个参数将被解释为运算符。因此,您可以使用 has('team',5) 来获取仅在5个团队中的用户。尽管如此,我已经在我的答案中添加了有关 doesntHave() 的说明,因为我认为使用它更合适。 - Umur Karagöz
@Lazysheepherd 哦,你说得对。我看了代码,只是没有深入到足够的层次。has() 最终会调用 where(),这就是为什么那种写法能够生效。谢谢。 - patricus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接