【问题标题】:Apply Laravel Nova filter to Computed Value将 Laravel Nova 过滤器应用于计算值
【发布时间】:2018-10-15 21:12:03
【问题描述】:

我有一个 Laravel Nova 资源,它内部有一个计算值,名为视图。我想添加一个 Nova 过滤器,它可以影响计算值的结果(而不是查询本身),但不知道如何做到这一点。

我的计算值如下所示:

Text::make('Views', function() {
    return $this->getViewsCount();
}),

我希望能够做类似的事情:

Text::make('Views', function() {
    if(isset($filterValue)) {
        return $this->getViewsBetween($filterValue);
    } else {
        return $this->getViewsCount();
    }
}

【问题讨论】:

    标签: laravel laravel-nova


    【解决方案1】:

    您可以尝试从请求中获取过滤器值:

    $queryFilters = $request->query('filters')
    

    该参数是 base64 和 json 编码的,因此您必须先对其进行解码。 看看Laravel\Nova\Http\Requests\DecodesFilters 作为参考。

    您的计算字段可能如下所示:

    Text::make('Views', function () use ($request) {
    
        $queryFilters = $request->query('filters');
        $decodedFilters = collect(json_decode(base64_decode($queryFilters), true));
        $computed = $decodedFilters->map(function ($filter) {
            return $this->getViewsBetween($filter['value']);
        });
    
        if ($computed->isEmpty()) {
            return $this->getViewsCount();
        }
    
        return $computed->implode(',');
    })
    

    更新:$decodedFilters 保存所选过滤器的类和值。

    Illuminate\Support\Collection {
      #items: array:1 [
        0 => array:2 [
          "class" => "App\Nova\Filters\UserType"
          "value" => "admin"
        ]
      ]
    }
    

    【讨论】:

    • 我怎么知道我得到了哪个过滤器的值?我很困惑。我怎么知道我没有得到不同的过滤器?
    • @G.S.好点子!您可以在$decodedFilters 集合中检查class。我已将 dump-server 命令的输出添加到我的答案中。
    【解决方案2】:

    关于冲突id 字段的过滤器替换了模型id 字段和计算字段中的$this->id 来自另一个表,而不是来自模型。所以解决方案是重复->select([...]) 查询(相同!)来自具有别名的模型的值。例如(用userid别名解决user.id字段)

    型号

    <?php
    
    namespace App\Models;
    
    use Illuminate\Database\Eloquent\Factories\HasFactory;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Notifications\Notifiable;
    
    class User extends Model
    {
       //...
    
       public function scopeMyScope($query, int $userId) : bool
       {
          return $query
                ->select('user.id', 'user.id as userid'/*,...*/)
                ->[...];
       }
    
       //...
    

    过滤器

    <?php
    namespace App\Nova\Filters;
    
    
    use Illuminate\Container\Container;
    use Illuminate\Http\Request;
    use Laravel\Nova\Filters\Filter;
    
    class MyFilter extends Filter
    {
       //...
    
       public function apply(Request $request, $query, $value)
       {
            //Same select fields as in model with userid, dont skip select in the filter!
            return $query
                ->select('user.id', 'user.id as userid'/*,...*/)
                ->[...];
       }
    
       //...
    
    

    资源

    <?php
    
    namespace App\Nova;
    
    use App\Nova\Filters\MyFilter;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\Log;
    use Laravel\Nova\Fields\Boolean;
    use Laravel\Nova\Fields\HasMany;
    use Laravel\Nova\Fields\ID;
    use Laravel\Nova\Fields\Text;
    
    class User extends \App\Nova
    {
       //...
       public function fields(Request $request)
       {
          return [
             //userid
             Boolean::make('some', function () {
                return \App\Models\User::myScope($this->userid);
             }),
          ];
       }
    
       //...
    }
    

    【讨论】:

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