Filter belongs-to-many in October CMS adminpanel
If you do full-fledged OctoberCMS-based solutions, you can hardly do without entity filters in the administrative panel. Even if you didn't think of them at the creation stage, sometime just before the launch of the project, when the client enters his numerous data into the project, the issue of managing this data will become quite acute.
Якщо ви робите повноцінні рішення на базі 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);
});
}Вуаля :)