Как создать фильтр для модели?

Как новичку в Laravel нужно реализовать динамические фильтры для различных сущностей в CRM системе. Начнем с первой задачи, которая заключается в формировании данных для фронтенда. Каким образом можно получить список полей (или свойств, атрибутов) с их типами данных (первоначально строка, число, а затем уже связи) для построения фильтров?
  • 23 февраля 2024 г. 8:18
Ответы на вопрос 2
Для создания фильтра для модели в Laravel, вы можете использовать Query Builder или Eloquent ORM.

1. Используя Query Builder:
```php
$filters = DB::table('table_name')->select('column_name')->distinct()->get();
// $filters содержит список уникальных значений из столбца 'column_name'
```

2. Используя Eloquent ORM:
```php
$filters = Model::select('column_name')->distinct()->get();
// $filters содержит список уникальных значений из столбца 'column_name'
```

Далее вам необходимо передать данные $filters в представление (например, в виде JSON) и отобразить их на фронтенде для выбора пользователем.

Для реализации динамических фильтров, вам также потребуется отслеживать выбранные пользователем фильтры и применять их к запросу к базе данных. Вы можете использовать методы where() или whereIn() для этого.

Пример использования фильтрации с Query Builder:
```php
$filteredData = DB::table('table_name')->where('column_name', '=', $filterValue)->get();
// $filteredData содержит данные, отфильтрованные по значению 'filterValue' в столбце 'column_name'
```

Пример использования фильтрации с Eloquent ORM:
```php
$filteredData = Model::where('column_name', '=', $filterValue)->get();
// $filteredData содержит данные, отфильтрованные по значению 'filterValue' в столбце 'column_name'
```

Таким образом, после получения выбранных пользователем фильтров, вы можете динамически применять их к запросу и получать соответствующие результаты.
Посмотри в строну этого пакета https://github.com/asseco-voice/laravel-json-query... Позволяет на основу пришедших с фронта json-данных построить запрос. 

Список свойств получить просто.

array_keys(Article::first()->getAttributes());

Если для каждого поля заполнить данные в свойстве $casts то через метод getCasts() можно получать тип данных.

Вот решение как получить список всех объявленных связей в модели https://gist.github.com/shanginn/aadddec758efb595b... Не тестировал. Но вообще такое можно и самому сделать через атрибуты, например, или рефлексию.
Похожие вопросы