我有一个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();
}
}
答案 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'/*,...*/)
->[...];
}
//...