将Laravel Nova过滤器应用于计算值

时间:2018-10-15 21:12:03

标签: laravel laravel-nova

我有一个Laravel Nova资源,并且在它内部有一个名为view的计算值。我想添加一个Nova过滤器,该过滤器可能会影响计算值的结果(而不是查询本身),但无法弄清楚该怎么做。

我的计算值如下:

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

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

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

2 个答案:

答案 0 :(得分:2)

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

$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"
    ]
  ]
}

答案 1 :(得分:0)

关于过滤器冲突lower字段的相同问题替换了模型SELECT id, code, first_name, last_name, code FROM players WHERE team_id = 3 AND ( code ILIKE '%lushijo%' OR full_name ILIKE '%lushijo%' ) LIMIT 15; 字段,而计算字段中的id来自另一个表,而不是来自模型。因此,解决方案是从具有别名的模型重复id查询(相同!)值。例如(用$this->id别名解决->select([...])字段)

模型

user.id

过滤器

userid

资源

<?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'/*,...*/)
            ->[...];
   }

   //...