Уловки для красноречивых отношений в Laravel

Одной из сильных сторон Laravel является его элегантный синтаксис. Если у вас много моделей и отношений в Laravel (из-за большого количества таблиц в базе данных), обход часто может закончиться менее элегантным кодом. Со временем мне пригодились три небольших расширения, о которых я хотел бы кратко рассказать ниже. Для этого мы просто используем наследование, магические методы и собственные коллекции.


Сначала мы создаем новую модель в app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Затем мы позволяем всем моделям унаследовать нашу новую ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Смешивайте свои функции с отношениями

Если вы хотите получить подключенные модели, используйте стандартный синтаксис для их вызова:

b45e29b9125c2ab565b5526442437686

Если вы теперь добавляете свою собственную бизнес-логику, вам нравится использовать (нижнюю) нотацию верблюжьего регистра:

b45e29b9125c2ab565b5526442437686

Мы хотим стандартизировать синтаксис обоих вариантов. Для этого мы добавляем магический метод __call в ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Этот вызов также возможен в приведенном выше примере.:

b45e29b9125c2ab565b5526442437686

Проверить пустые объекты

Если вам нужно вывести название страны, указанное в адресе человека, вы часто увидите следующий код.:

b45e29b9125c2ab565b5526442437686

Чтобы предотвратить это, мы подключаем библиотеку stringhelper и возвращаем специальный объект пустого класса `empty`, если модель не найдена.:

b45e29b9125c2ab565b5526442437686

Это означает, что вызов успешен (в данном примере, если что-то найдено, выводится название страны, во всех остальных случаях пустая строка):

b45e29b9125c2ab565b5526442437686

Если мы также хотим охватить случай, когда пользователь с ID 42 может даже не существовать, мы также создадим небольшую вспомогательную функцию для этого.:

b45e29b9125c2ab565b5526442437686

Таким образом, следующий вызов возвращает пустую строку, даже если пользователь вообще не существует.:

b45e29b9125c2ab565b5526442437686

Удобно обходить отношения n: m

Наконец, мы хотим упростить следующий код:

b45e29b9125c2ab565b5526442437686

Для этого мы используем возможность кастомных коллекций . Мы сначала расширяем удобную модель:

b45e29b9125c2ab565b5526442437686

Далее мы создаём файл app\Helpers\ConvenienceCollection.php , который гарантирует, что при вызове неизвестных функций в коллекциях, функция будет выполнена для всех элементов в коллекции.:

b45e29b9125c2ab565b5526442437686

Таким образом, мы можем использовать следующий код для вывода всех имен всех стран всех адресов всех родителей человека.:

b45e29b9125c2ab565b5526442437686

Но также возможны следующие вызовы:

b45e29b9125c2ab565b5526442437686

Сортировать по нескольким столбцам

Следующая команда сортирует данные только по местоположению , хотя, вероятно, это не было желаемым результатом.:

b45e29b9125c2ab565b5526442437686

Мы расширяем нашу коллекцию ConvenienceCollection, чтобы включить сортировку по нескольким столбцам:

b45e29b9125c2ab565b5526442437686

При этом мы можем отсортировать коллекцию по нескольким столбцам с:

b45e29b9125c2ab565b5526442437686

Стандартная сортировка

Мы расширяем ConvenienceCollection еще одной вспомогательной функцией:

b45e29b9125c2ab565b5526442437686

Теперь вы можете дать каждой модели индивидуальную стандартную функцию сортировки.:

b45e29b9125c2ab565b5526442437686

Итак, мы можем отсортировать коллекцию с помощью:

b45e29b9125c2ab565b5526442437686

Имена объектов

Каждая модель реализует метод getLabel (getName зависит от модели):

b45e29b9125c2ab565b5526442437686

С его помощью вы можете быстро и легко отобразить имя объекта. Затем вы можете реализовать вспомогательный метод sortByLabel в ConvenienceCollection:

b45e29b9125c2ab565b5526442437686

Пустые результаты

Если промежуточный шаг пуст, функции Laravel first () и last () обычно возвращают ноль. Поэтому мы вводим getFirst () и getLast (), чтобы следующий вызов всегда выполнялся успешно.:

b45e29b9125c2ab565b5526442437686

Таким образом, мы возвращаем __empty_helper, который распознает __x:

b45e29b9125c2ab565b5526442437686

Назад