【问题标题】:Add condition and joins to connected tables in laravel向 laravel 中的连接表添加条件和连接
【发布时间】:2019-07-17 08:07:46
【问题描述】:

我有一个用户表,它有 userRole。我想添加条件以获取 userRole 中所有具有“role_id”1 的用户。

用户模型中的关系:

public function userRole() 
{   
  return $this->hasOne(UserRole::class); 
}

和控制器代码:

$users = User::with(["userRole" => function ($query){
                        $query->where('role_id', 1);   
                    }])->get();

这不能正常工作。它获取所有用户并获取 userRole,以防其 role_id 为 2,否则 userRole 为空。

【问题讨论】:

    标签: php mysql laravel join


    【解决方案1】:

    这可能会对您有所帮助。请尝试在您的控制器中添加以下 sn-p

    User::with(['userRole'])->wherehas('userRole', function ($query) {$query->where('role_id','1');})->get();
    

    【讨论】:

    • 你忘了加上"with('userRole')" 正确的是User::with(['userRole'])->wherehas('userRole', function ($query) {$查询->where('role_id','1');})->get();谢谢它有很大帮助。
    【解决方案2】:

    尝试加载反向关系。 像这样的:

    // in UserRole.php file
    public function users() 
    {   
      return $this->hasMany(User::class); 
    }
    

    你的查询是这样的:

    $role = UserRole::with("users")->where('id', 2)->get();
    $users = $role->users;
    

    【讨论】:

    • 但这对我来说不可行,因为我还必须与用户添加其他联接。
    【解决方案3】:

    得到了解决方案,我们可以通过 wherehas 做到这一点

    User::with(['userRole'])->wherehas('userRole', function ($query) {$query->where('role_id','1');})->get(); 
    

    【讨论】:

      【解决方案4】:

      说明:

      with() 用于预加载。因此,基本上使用with('userRole') 将为您获取该特定用户的所有角色。

      当你使用时:

      User::with(["userRole" => function ($query){
           return $query->where('role_id', 1);   
      }])->get();
      

      你告诉 Laravel,给我所有用户,他们的角色,但获取的角色应该只有 role_id1。请勿选择此条件以外的角色。

      Laravel 有一个函数whereHas,它不会选择任何东西,而是根据孩子的条件过滤父关系。

      例如。我们需要让角色 id 为 1 的用户:

      User::wherehas('userRole', function ($q) {
          return $q->where('role_id','1');
      })->get();
      

      现在这将告诉 Laravel 让我获取所有具有至少 1 个条目 userRoles 且 role_id 为 1 的用户。

      这只会根据角色关系过滤用户。但是,我们需要单独添加with() 子句来获取角色。

      User::with('userRole')->wherehas('userRole', function ($q) {
          return $q->where('role_id','1');
      })->get();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-19
        • 2015-01-10
        • 2019-07-18
        • 1970-01-01
        • 2011-02-19
        相关资源
        最近更新 更多