【问题标题】:Laravel nova belongsTo filterLaravel nova 属于过滤器
【发布时间】:2019-03-28 22:52:30
【问题描述】:

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

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

我创建了一个新的资源锦标赛,其中包含 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】:

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

    例如

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

    【讨论】:

    • 你确定我必须在冠军资源上创建相关的方法吗?因为 associatableQueryMethod 在 User 模型上搜索相关方法
    【解决方案2】:

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

    就是这样,请记住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;
    }
    

    【讨论】:

      【解决方案3】:

      您可以使用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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-01
        • 2021-01-26
        • 2021-06-18
        • 1970-01-01
        • 2022-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多