Фильтр belongsToMany в админке October
Если вы делаете полноценные решения на базе OctoberCMS, то без фильтров сущностей в административной панели Вам вряд ли обойтись. Даже если вы их не задумывали на этапе создания, где-то перед самым запуском проекта, когда клиент внесет свои многочисленные данные в проект, вопрос управления этими данными станет достаточно остро.
Якщо ви робите повноцінні рішення на базі 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);
});
}Вуаля :)