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

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


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

b45e29b9125c2ab565b5526442437686

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

b45e29b9125c2ab565b5526442437686

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

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

b45e29b9125c2ab565b5526442437686

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

b45e29b9125c2ab565b5526442437686

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

b45e29b9125c2ab565b5526442437686

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

b45e29b9125c2ab565b5526442437686

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

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

b45e29b9125c2ab565b5526442437686

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

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

Назад