Уловки для красноречивых отношений в 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

Назад