我有一个桌冠和一个桌用户。我也有相同的模型(冠军和用户)。
在一个冠军赛中可能是一名主裁判,主裁和法官。它们都是我的应用程序中的角色并存储在角色表中。
我用3个belongsTo字段创建了一个新的资源锦标赛。所有这些都可以搜索到。
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,但是如果我有3个用户字段,如何在用户资源中使用它。
在锦标赛资源上,您必须创建具有关系名称的函数。
EG
public static function relatableMainSecretary(NovaRequest $request, $query)
{
return $query->where(...);
}
实现这一目标的最简单(和非官方)方法是嗅探请求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;
}