Laravel Nova属于过滤器

时间:2018-10-24 13:35:09

标签: laravel-5 eloquent laravel-nova

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

在一个总冠军中,可以由一位主要法官,主要秘书和法官操作员担任。所有这些在我的应用程序中也是角色,并存储在角色表中。

我创建了一个新的资源冠军,其中包含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资源中使用它。

3 个答案:

答案 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;
}