【问题标题】:How can I get Model Records that do not have a relation?如何获取没有关系的模型记录?
【发布时间】:2016-01-14 17:23:08
【问题描述】:

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

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

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

我需要这样的东西。

更新

忘了提 - 关系是多对多的,用户可以有多个团队

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    你可以使用doesntHave()方法:

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

    如果你需要“或”它,第二个参数可以让你改变它:

    $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 字段。 因此,您唯一需要做的就是寻找带有 null team_id 字段的用户。

      那就是;

      $q = User::where('team_id',null)->orWhere('name','David')->get();
      

      编辑: 但是,如果您的关系是多对多(每个用户可能属于多个团队),则应使用Eloquent's has() 方法;

      $users = User::has('teams', '0')->orWhere('name', 'David')->get();
      

      注意:patricus 指向in his answer;

      使用 Eloquent 方法 doesntHave() 也可以,在这种情况下似乎更合适。

      【讨论】:

      • has() 的第二个参数是运算符,而不是数字。应该是has('teams', '&lt;', 1)
      • @patricus 我认为不是这样。我发现has() 在参数方面很像where()。如果您提供 2 个参数,它会自动检查是否相等:has('arg1', 'arg2') = has('arg1,'=','arg2')。但是,如果您提供三个,则第二个将被解释为运算符。因此,您可以使用has('team',5) 来获取仅在 5 个团队中的用户。尽管如此,我还是在我的回答中添加了一个关于doesntHave() 的注释,因为我认为使用它会更合适。
      • @Lazysheepherd 啊,你是对的。我正在查看代码,但还不够深入。 has() 最终会调用 where(),这就是该符号有效的原因。谢谢。
      猜你喜欢
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-03-25
      • 1970-01-01
      相关资源
      最近更新 更多