3

我有一张牌桌冠军和一张牌桌用户。我也有相同的模型(冠军和用户)。

在一个锦标赛中可能有一名主裁判、主秘书和裁判操作员。所有这些也是我的应用程序中的角色并存储在角色表中。

我创建了一个新的资源锦标赛,其中包含 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 个用户字段,我如何在用户资源中使用它。

4

3 回答 3

2

在冠军资源上,您必须创建具有关系名称的函数。

例如

public static function relatableMainSecretary(NovaRequest $request, $query)
{
    return $query->where(...);
}
于 2018-10-25T08:12:05.827 回答
2

实现这一点的最简单(和非官方)方法是嗅探请求 URL 的结构。考虑到这一点,您可以简单地覆盖类relatableQuery中的方法Nova/User

这就是它可以完成的方式,请记住该strtolower功能是可选的,并且只是节省了区分大小写的错别字的不必要麻烦。

public static function relatableQuery(NovaRequest $request, $query)
{
    $requestSegment = strtolower($request->segment(4));

    if ($requestSegment === 'mainjudge') {
        return $query->where(...);
    }

    if ($requestSegment === 'mainsecretary') {
        return $query->where(...);
    }

    if ($requestSegment === 'judgeoperator') {
        return $query->where(...);
    }
    
    return $query;
}
于 2019-07-01T15:32:36.973 回答
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;
}
于 2021-08-03T11:52:23.027 回答