Laravel nova属于过滤器

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

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

在一个冠军赛中可能是一名主裁判,主裁和法官。它们都是我的应用程序中的角色并存储在角色表中。

我用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个用户字段,如何在用户资源中使用它。

laravel-5 eloquent laravel-nova
1个回答
1
投票

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

EG

public static function relatableMainSecretary(NovaRequest $request, $query)
{
    return $query->where(...);
}

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.