如何使用 spatie/laravel-query-builder 过滤/搜索具有关系的数据? (拉拉维尔)

Posted

技术标签:

【中文标题】如何使用 spatie/laravel-query-builder 过滤/搜索具有关系的数据? (拉拉维尔)【英文标题】:How To Use spatie/laravel-query-builder For Filtering/Searching Data with Relationship? (Laravel) 【发布时间】:2021-10-29 02:00:42 【问题描述】:

当我询问如何过滤有关系的数据时,有人推荐我使用 spatie/laravel-query-builder 过滤/搜索数据。我仍然对此感到困惑。

我正在尝试做的事情:过滤/搜索角色为“学生”(关系)的数据并包含“x”字。

mycontroller.php 在添加任何 spatie/query-builder 代码之前

public function searchStudent(Request $request)
        
            $user = Auth::user(); // Untuk Photo Profile
            // menangkap data pencarian
            $search = $request->table_search;
                // This part is the code that supposed to filter the search that has relation to data named Student in name column
            $search = User::whereHas('roles', function($q)
                $q->where('name', 'Student');
            )->where('name','like',"%".$search."%")
            ->orWhere('nisn','like',"%".$search."%")
            ->orWhere('username','like',"%".$search."%")
            ->get();
                // // what I got is actually the normal search, so all other relation than Student also show up
            return view('pages.admin.user.student.showStudentFiltered', compact('search', 'user') );
        

我得到的只是一个旧的常规搜索...它们只显示所有包含“x”字的数据,但不显示它们之间的关系。

我想要的示例搜索数据:搜索具有“学生”角色的单词“A”用户

Aqua|角色:学生

阿明|角色:学生

Alpine|角色:学生

我得到了什么:

管理员|角色:管理员

阿姆斯特丹|角色:老师

阿梅尔|角色:老师

Aqua|角色:学生

阿明|角色:学生

Alpine|角色:学生

有人知道如何使用 spatie/laravel-query-builder 或如何获得我想要的过滤/搜索功能吗?我需要重写什么代码?

【问题讨论】:

【参考方案1】:

查询构建器whereHas 的底层SQL 没有加入,它只是一个额外的where 子句。 with 将为您加入。 使用

User::with('roles')->whereHas('roles', function($q)
                $q->where('name', 'Student');
            )

【讨论】:

所以....像这样? $search = User::with('roles')->whereHas('roles', function($q) $q->where('name', 'Student'); )->where('name' ,'like',"%".$search."%") ->orWhere('nisn','like',"%".$search."%") ->orWhere('username','like' ,"%".$search."%") ->get();能用吗?

以上是关于如何使用 spatie/laravel-query-builder 过滤/搜索具有关系的数据? (拉拉维尔)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本机反应创建登录以及如何验证会话

如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]

如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?