我有一张桌冠军和一张桌使用者。我也有相同的模型(冠军和用户)。
在一个总冠军中,可以由一位主要法官,主要秘书和法官操作员担任。所有这些在我的应用程序中也是角色,并存储在角色表中。
我创建了一个新的资源冠军,其中包含3个场次字段。全部都可搜索。
BelongsTo::make('Main judge', 'mainJudge', User::class)
->onFormsAndDetail()
->searchable(),
BelongsTo::make('Main secreatary', 'mainSecretary', User::class)
->onFormsAndDetail()
->searchable(),
BelongsTo::make('Judge operator', 'judgeOperator', User::class)
->onFormsAndDetail()
->searchable(),
在搜索过程中,我需要过滤查询,以便仅搜索具有相同角色的用户。
例如,在搜索主要法官期间,我必须在查询中包括下一个过滤器
select *
from users u
join users_roles ur on u.id = ur.user_id
join roles r on ur.role_id = r.id
where r.alias = 'judge'
我已经在app / Nova / Resource.php中找到了一些方法,例如 relatableQuery ,但是如果我与User有3个字段,该如何在User资源中使用它。
答案 0 :(得分:1)
在冠军资源上,您必须创建带有关系名称的功能。
例如
public static function relatableMainSecretary(NovaRequest $request, $query)
{
return $query->where(...);
}
答案 1 :(得分:0)
最简单(非官方)的方法是嗅探请求URL的结构。考虑到这一点,您可以在relatableQuery
类中简单地重写Nova/User
方法。
这是可以完成的操作,请记住strtolower
函数是可选的,并且使用区分大小写的错字来节省不必要的麻烦。
public static function relatableQuery(NovaRequest $request, $query)
{
if (strtolower($request->segment(4)) === 'mainJudge') {
return $query->where(...);
}
if (strtolower($request->segment(4)) === 'mainSecretary') {
return $query->where(...);
}
if (strtolower($request->segment(4)) === 'judgeOperator') {
return $query->where(...);
}
return $query;
}
答案 2 :(得分:0)
您可以使用 https://nova.laravel.com/docs/3.0/resources/authorization.html#dynamic-relatable-methods
修改查询User.php
资源
public static function relatableUser(NovaRequest $request, $query)
{
if ($request->segment(4) === 'mainjudge' && $request->search) {
return $query->where(); // your query
}
return $query;
}