Фільтр belongs-to-many в адмінці October

Якщо ви робите повноцінні рішення на базі OctoberCMS, то без фільтрів сутностей адміністративної панелі вам навряд чи обійтися. Навіть якщо ви їх не замислювали на етапі створення, десь перед запуском проекту, коли клієнт внесе свої численні дані в проект, питання управління цими даними стане досить гостро.

Документація October щодо створення фільтрів має умовний, поверхневий характер. Особливо це стосується зв'язків belongsToMany, коли крім самих моделей присутня pivot-таблиця. Давайте напишемо такий код самі.


Всі нестандартні вибірки з моделі в Laravel реалізуються через scope. Наприклад:


public function scopeHomePageRecommend($query)
{
$current_cite_sity = config('app.current_site_city');

return \Cache::remember('home_page_recommend', 3600, function() use ($query, $current_cite_sity) {

return $query->where('city_id', $current_cite_sity)->where('is_recommend', 1)->with('image', 'gallery')->take(3)->get()->toArray();

});
}

Тоді отримати результат виконання цього запиту можна просто за допомогою ModelName::HomePageRecommend()

Аналогічним способом можна домогтися роботи фільтра у своїх плагінах для зв'язку типу belongsToMany. У config_filter.yaml додаємо:


category:
label: Категорія
modelClass: Path\To\Your\Model
scope: FilterCategories
nameFrom: name

З параметра scope стає зрозуміло, яку назву методу нам потрібно створити в моделі: scopeFilterCategories(). Давайте створимо його



public function scopeFilterCategories($query, $categories)
{
return $query->whereHas('categories', function($q) use ($categories) {
$q->withoutGlobalScope(NestedTreeScope::class)->whereIn('id', $categories);
});
}


Вуаля :)

Ніколи не піздно розвити свій бізнес

Приступити

Цей сайт використовує файли cookie. Ми не персоналізуємо Вас, а лише робимо серфінг на сайті зручнішим. Ви можете ознайомитись з нашою Політикою приватності.