有一个“课程”集合,其中包含两个分类法:“课程级别”和“课程类别”。目前,我使用以下循环按级别迭代所有课程。但是,我现在想应用基于第二个分类“courses_categories”的过滤器。
{{ taxonomy:courses_levels }}
{{ entries query_scope="filter_by_categories_and_levels" }}
{{ partial:courses.preview }}
{{ /entries }}
{{ /taxonomy:courses_levels }}
老实说,我不知道该怎么做。我正在考虑使用 query_scope,前提是我可以检索 URL 参数。我已经设置了一个生成 URL 的表单,如下所示:http://url.test/formations/niveaux-et-categories?animalieres=1&artisanat=1.
如何使用第二个分类法过滤条目?
注意:现阶段我并不是在寻找 JavaScript 解决方案。我正在研究没有 JS 的后备解决方案。
<?php
namespace App\Scopes;
use Statamic\Query\Scopes\Scope;
class FilterByCategoriesAndLevels extends Scope
{
/**
* Apply the scope.
*
* @param \Statamic\Query\Builder $query
* @param array $values
* @return void
*/
public function apply($query, $values)
{
// HELP NEEDED HERE
}
}
为级别和类别创建单个查询范围可能不是一个好主意。此外,全局作用域,例如您提出的
FilterByCategoriesAndLevels
类,不接受参数。
我会在 Course 类中为每个关系创建两个本地范围。
class Course extends Model
{
public function level()
{
return $this->belongsTo(Level::class);
}
public function categories()
{
return $this->belongsToMany(Level::class);
}
public function scopeAtLevel($query, $levelId)
{
return $query->whereRelation('level', 'id', $levelId);
}
public function scopeHavingCategory($query, $categoryId)
{
return $query->whereRelation('categories', 'id', $categoryId);
}
}
然后您可以通过执行以下操作来检索结果:
Course::atLevel(request('level_id'))
->havingCategory(request('category_id'))
->get();
我希望我正确理解了你。如果不是请澄清。