Хитрощі для красномовних відносин Laravel

Однією з сильних сторін Laravel є його елегантний синтаксис. Якщо у вас багато моделей і зв’язків у Laravel (через велику кількість таблиць у базі даних), обхід часто може закінчитися менш елегантним кодом. З часом три невеликі розширення виявилися успішними для мене, про які я хотів би коротко представити нижче. Для цього ми просто використовуємо спадковість, магічні методи та спеціальні колекції.


Спочатку ми створюємо нову модель під app \ ConvenienceModel.php:

b45e29b9125c2ab565b5526442437686

Тоді ми дозволяємо всім моделям успадковуватись від нашого нового ConvenienceModel:

b45e29b9125c2ab565b5526442437686

Поєднуйте власні функції із стосунками

Якщо ви хочете отримати підключені моделі, ви використовуєте стандартний синтаксис, щоб викликати їх:

b45e29b9125c2ab565b5526442437686

Якщо тепер ви додасте власну ділову логіку, то вам подобається використовувати позначення (нижнього) верблюда:

b45e29b9125c2ab565b5526442437686

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

b45e29b9125c2ab565b5526442437686

Цей виклик також можливий у прикладі вище:

b45e29b9125c2ab565b5526442437686

Перевірте порожні об'єкти

Якщо ви хочете вивести назву країни для адреси особи, ви часто бачите наступний код:

b45e29b9125c2ab565b5526442437686

Щоб запобігти цьому, ми включаємо бібліотеку stringhelper та повертаємо спеціальний об'єкт порожнього класу `empty`, якщо модель не знайдена.:

b45e29b9125c2ab565b5526442437686

Це означає, що виклик успішний (у цьому прикладі, якщо щось знайдено, виводиться назва країни, у всіх інших випадках порожній рядок):

b45e29b9125c2ab565b5526442437686

Якщо ми також хочемо охопити випадок, що користувач з ідентифікатором 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

Назад