如何创建 Nova 过滤器以按其关系过滤资源?
How can create a Nova filter to filter a resource by its relation?
我有一个有很多类别(多对多关系)的问题资源。我想为不同类别的问题资源创建一个过滤器。
<?php
namespace App\Nova\Filters;
use Illuminate\Http\Request;
use Laravel\Nova\Filters\Filter;
class CategoryType extends Filter
{
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
*/
public function apply(Request $request, $query, $value)
{
return $query->categories()->where('id', $value);
}
/**
* Get the filter's available options.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function options(Request $request)
{
$categories = \App\Category::all();
return $categories->pluck('id', 'name')->all();
}
}
$query
是类型 \Illuminate\Database\Eloquent\Builder
,不能使用 Eloquent 模型方法 categories()
。
尝试使用如下所示的连接。 category_question
是中间 table。我没有测试过,希望这对你有帮助。
return $query
->join('category_question as cq', 'questions.id', 'cq.question_id')
->where('cq.category_id', $value)
->get();
就像查询任何关系一样,您想使用闭包。
public function apply(Request $request, $query, $value)
{
return $query->whereHas('categories', function($query) use ($value) {
$query->where('id', $value);
});
}
我有一个有很多类别(多对多关系)的问题资源。我想为不同类别的问题资源创建一个过滤器。
<?php
namespace App\Nova\Filters;
use Illuminate\Http\Request;
use Laravel\Nova\Filters\Filter;
class CategoryType extends Filter
{
/**
* Apply the filter to the given query.
*
* @param \Illuminate\Http\Request $request
* @param \Illuminate\Database\Eloquent\Builder $query
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder
*/
public function apply(Request $request, $query, $value)
{
return $query->categories()->where('id', $value);
}
/**
* Get the filter's available options.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function options(Request $request)
{
$categories = \App\Category::all();
return $categories->pluck('id', 'name')->all();
}
}
$query
是类型 \Illuminate\Database\Eloquent\Builder
,不能使用 Eloquent 模型方法 categories()
。
尝试使用如下所示的连接。 category_question
是中间 table。我没有测试过,希望这对你有帮助。
return $query
->join('category_question as cq', 'questions.id', 'cq.question_id')
->where('cq.category_id', $value)
->get();
就像查询任何关系一样,您想使用闭包。
public function apply(Request $request, $query, $value)
{
return $query->whereHas('categories', function($query) use ($value) {
$query->where('id', $value);
});
}