在 Laravel 中搜索多对多关系

问题描述 投票:0回答:1

我正在构建一个 Laravel API。我有两个模型,角色和权限,它们之间有多对多的关系。一个角色可以有多个权限,一个权限可以属于多个角色。我有一个数据透视permissions_roles表。

在前端,我有一个日期和状态过滤器以及搜索功能。我希望能够输入搜索关键字并能够在角色和权限表中搜索它。即,如果我输入 create,它应该与名称为“create”的角色匹配,或者显示在其权限之一中具有“create”的角色的结果。

这就是我所拥有的,但我没有得到想要的结果,特别是当我组合请求参数时。

$roles = Role::with('permissions','users');

if($request->search_term){
    $roles->whereHas('permissions', function ($query) use ($request) {
        $query->where('name', 'like', '%' . $request->search_term . '%');
    })->orWhere('name', 'like', '%' . $request->search_term . '%');
}

$roles->when($request->status !== null, function (Builder $query) use ($request) {
    $statuses = isIntegerOrCommaSeparatedInteger($request->status, 'statuses');
    return $query->whereIn('active', $statuses);
});

$roles->when($request->start_date && $request->end_date, function (Builder $query) use ($request) {
    return $query->whereBetween(
        DB::raw('date(created_at)'),
        [
            Carbon::createFromDate($request->start_date)->toDateString(),
            Carbon::createFromDate($request->end_date)->toDateString()
        ]
    );
});

$roles = $roles->get();

有没有更好的方法可以实现这一点?

谢谢

mysql laravel search eloquent many-to-many
1个回答
0
投票

谢谢马赫迪·拉希迪。那行得通。所以,万一有人遇到这个。我用 Mahdi 建议的内容替换了搜索查询。

$roles = Role::with('permissions', 'users');

            if ($request->search_term) {
                $roles->where(function ($q) use ($request) {
                    return $q->whereHas('permissions', function ($query) use ($request) {
                        $query->where('name', 'like', '%' . $request->search_term . '%');
                    })
                        ->orWhere('name', 'like', '%' . $request->search_term . '%');
                });
            }


            $roles->when($request->status !== null, function (Builder $query) use ($request) {
                $statuses = isIntegerOrCommaSeparatedInteger($request->status, 'statuses');
                return $query->whereIn('active', $statuses);
            });

            $roles->when($request->start_date && $request->end_date, function (Builder $query) use ($request) {
                return $query->whereBetween(
                    DB::raw('date(created_at)'),
                    [
                        Carbon::createFromDate($request->start_date)->toDateString(),
                        Carbon::createFromDate($request->end_date)->toDateString()
                    ]
                );
            });

            $roles = $roles->get();

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.