按分类过滤条目

问题描述 投票:0回答:1

有一个“课程”集合,其中包含两个分类法:“课程级别”和“课程类别”。目前,我使用以下循环按级别迭代所有课程。但是,我现在想应用基于第二个分类“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
    }
}
php laravel filter eloquent statamic
1个回答
0
投票

为级别和类别创建单个查询范围可能不是一个好主意。此外,全局作用域,例如您提出的

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();

我希望我正确理解了你。如果不是请澄清。

© www.soinside.com 2019 - 2024. All rights reserved.