【问题标题】:Using whereHas to make filter query in laravel returns empty data?在 laravel 中使用 whereHas 进行过滤查询返回空数据?
【发布时间】:2021-08-16 12:12:43
【问题描述】:

我有角色和管理员表以及 admin_role 的数据透视表

角色表结构

id, role_name, slug

admins 表结构

id, name, email, phone

admin_role 表结构

id, role_id, admin_id

Admin.php 模型

public function roles() {
    return $this->belongsToMany(Role::class,'admin_role');
}

Role.php 模型

public function admins() {
    return $this->belongsToMany(Admin::class,'admin_role');  
}

AdminController.php

public function getTeams() {
    try {
        $selectedName = request('name');
        $selectedRole = request('role');
        $selectedPhone = request('phone');
        $admins = Admin::with(['roles','resources'])
            ->when($selectedName, function($query) use($selectedName) {
                $query->where('name', 'like', '%' .$selectedName.'%');
            })
            ->when($selectedPhone, function($query) use($selectedPhone) {
                $query->where('phone_number', $selectedPhone);
            })
            ->when($selectedRole, function($query) use($selectedRole) {
                $query->whereHas('roles', function ($q) use($selectedRole){
                    $q->whereIn('role_id', $selectedRole);
                });
            })
            ->orderBy('id', 'desc')
            ->paginate(10);
        return response()->json($admins);
    } catch (\Illuminate\Database\QueryException $e) {
        $e = "Get teams Api Error";
        return response()->json($e);
    }
}

上面的查询工作正常,它根据选定的姓名、电话过滤数据,但在添加 whereHas 子句进行基于角色的过滤后,它返回空数组。仅当我在选定角色中传递数据时,过滤才有效。

关于我在哪里犯错的任何建议。

我已经添加了管理表的 UI。

如果不应用任何过滤器,如(姓名、电子邮件、电话、角色),它应该根据我添加的默认查询显示数据。选择过滤器选项后,它应该根据该过滤器参数显示数据。

我的问题:如果我传递了角色,那么数据会显示在表中,但如果没有选择任何过滤器,那么就会出现空表而不是默认数据。

在我从AdminController 删除以下查询后,数据将返回到UI table,但如果我添加它,则只有在选择角色时才会返回数据。

->when($selectedRole, function($query) use($selectedRole) {
    $query->whereHas('roles', function ($q) use($selectedRole){
        $q->whereIn('role_id', $selectedRole);
    });
})

【问题讨论】:

  • 你在 $selectedRole 中得到了什么?是单值还是数组?
  • 它是一个类似 ["1","2"] 的数组
  • 尝试改变:$q->whereIn('role_id', $selectedRole); to $q->whereIn('id', $selectedRole);

标签: php laravel


【解决方案1】:

我认为您可以通过在如下查询中提及表名 admin_role 来解决您的问题

$q->whereIn('admin_role.role_id', $selectedRole);

$q->whereIn('admin_role.id', $selectedRole);

更新

->when((isset($selectedRole)&&count($selectedRole)), function($query) use($selectedRole) {
    $query->whereHas('roles', function ($q) use($selectedRole){
      $q->whereIn('admin_role.id', $selectedRole);
    });
})

【讨论】:

  • 同样的问题,它返回空数组
  • @anji。我有更新答案。它应该是 admin_role
  • ->when($selectedRole, function($query) use($selectedRole) { $query->whereHas('roles', function ($q) use($selectedRole){ $q->whereIn('roles.id', $selectedRole); }); }) 只有在有任何 selectedRole 值时才应该执行此查询,否则查询将按原样正常执行而无需应用过滤器。正是因为这个查询返回空数组而没有应用任何过滤器。
  • @anji.its not roles.id.check my updated answer
  • 不工作了,我认为问题出在 whereHas
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 1970-01-01
  • 2021-06-10
  • 2015-07-29
相关资源
最近更新 更多