WEB -
Перемкнути навігацію

Мова

  • Українська
  • Русский
  • Polski

Введіть щонайменше 3 символів для пошуку.

  • Українська
  • Русский
  • Polski
Підтримати проєкт

Пошук

Введіть щонайменше 3 символів для пошуку.

Книги
  • Книги
  • PHP
  • JavaScript
  • HTML і CSS
  • SQL і мови запитів
  • Дизайн
  • WordPress
  • SEO
  • Python
  • Інші теми
  • Laravel
  • Без категорії
  • Статті
  • Laravel
  • WordPress
  • Підтримати проєкт
  • © 2015-2026 Andrii Beznosko

  • Our partner

Робота з nullable-полями в Eloquent у Laravel

  • Опис
  • Опис/Завантаження

Laravel

Вступ

Якщо у вас є кілька моделей у Laravel з одним nullable-полем, створення мутатора для цього поля — процес доволі тривіальний:

public function setNicknameAttribute($nickname)
{
    $this->attributes['nickname'] = trim($nickname) == '' ? null : trim($nickname);
}

 

Тут ми перевіряємо вхідні дані, у цьому випадку — $nickname, на порожнечу. Якщо$nickname порожнє, то ми встановлюємо атрибуту значення null, інакше — trim($nickname).

Чому я використовую trim замість empty? Функція trim прибирає пробільні символи з початку та кінця рядка, а порівняння результату її виконання з порожнім рядком перевіряє, чи справді вхідні дані порожні. Це дає нам змогу переконатися в тому, що ніхто не намагається вставити в базу даних порожній рядок. А empty вважає будь-яку кількість пробільних символів непорожнім рядком.

Але за наявності кількох моделей із полями такого типу в базі даних з’являється дублювання коду; у кожній такій моделі потрібно встановлювати мутатор перевірки на порожнечу. Чи справді це — найкращий спосіб дій? Я бачу два способи прибрати дублювання коду в цьому випадку, і кожен із них залежить від вашого оточення (сервера).

Використання базової моделі

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

<?php namespace App;

use IlluminateDatabaseEloquentModel;

class BaseModel extends Model {

    public function __construct(array $attributes = array())
    {
        parent::__construct($attributes);
    }

    protected function nullIfEmpty($input)
    {
        return trim($input) == '' ? null : trim($input);
    }

}

 

Функція nullIfEmpty буде доступна в кожній моделі, що розширює BaseModel:

<?php namespace App;

class UserModel extends BaseModel {

    public function setNicknameAttribute($nickname)
    {
        $this->attributes['nickname'] = $this->nullIfEmpty($nickname);
    }

}

 

Цей спосіб працює, але не одразу зрозуміло, звідки приходить метод nullIfEmpty. Потрібен певний час, щоб з’ясувати, звідки він з’явився. Проте цю незрозумілість можна уникнути.

Але для тих, у кого версія PHP < 5.4.0, цей спосіб, мабуть, буде єдиним.

Використання трейтов

Якщо ви використовуєте версію PHP >= 5.4.0, трейти допоможуть вам красивим декларативним способом додати потрібну функціональність у модель.

<?php namespace AppTraits;

trait NullableFields {

    protected function nullIfEmpty($input)
    {
        return trim($input) == '' ? null : trim($input);
    }

}

 

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

<?php namespace App;

use AppTraitsNullableFields;
use IlluminateDatabaseEloquentModel;

class UserModel extends Model {

    use NullableFields;

    public function setNicknameAttribute($nickname)
    {
        $this->attributes['nickname'] = $this->nullIfEmpty($nickname);
    }

}

 

Висновок

Особисто я не вважаю, що якийсь із методів швидший; також обидва прості у використанні. Тому вибір у будь-якому разі за вами. Використання трейтов у Laravel більш декларативне, адже ви бачите NullableFields одразу в класі, і вам не потрібно шукати, звідки прийшов метод.

Але, на мою думку, використання трейтов більш бажане, тому що ви не завантажуєте базову модель методами обробки вхідних даних або будь-якими іншими методами, які безпосередньо до неї не належать. Перевантажувати клас — не найкраща ідея.

Коментарі

Всього коментарів: 0

Залишити коментар Скасувати відповідь

Ваш email не буде опубліковано.

Категорія: Главная » Laravel » Робота з nullable-полями в Eloquent у Laravel
Статус: For advanced readers
Посилання на оригінальну статтю (якщо вказано або стаття не є нашою) Завантажити
Додав Кві 17, 2026 00:23 Andriy

Статті, опубліковані на WEB-Программист, містять посилання на джерела. Адміністрація сайту не несе відповідальності за використання цих матеріалів.

Дивіться також:

Створення пакетів для Laravel

Prosper Otemuyiwa нещодавно написав статтю про те, як створювати пакети для Laravel 5 у своєму блозі. Хоча його спосіб абсолютно правильний і може вам підійти, я віддаю перевагу трохи іншому підходу до створення пакетів. Спочатку я створю новий репозиторій на...

DDD Ultra-Light

[caption id="attachment_547" align="aligncenter" width="891"] Laravel 4.2[/caption] DDD Ultra-Light: як застосувати Domain-Driven Design без зайвих витрат Деякі команди вважають Domain-Driven Design (DDD) складним, дорогим і таким, що потребує обережного впровадження. І справді: якщо підходити до DDD як до «великого проєкту перебудови»,...

Розширюємо класи Laravel методом `orAbort` за допомогою трейту

Розширюємо класи Laravel методом orAbort за допомогою трейту Іноді в Laravel ми пишемо однаковий шаблон: намагаємося отримати модель або одразу зупиняємо виконання з потрібним HTTP-кодом. Це працює, але код стає менш читабельним, а логіка розкидається по всьому проєкту. Вихід —...

Зв'яжіться з нами

- Преміум теми та плагіни WP Star безкоштовно -

Підтримати автора

Налаштування cookie

Ми використовуємо необов’язкові аналітичні cookie, щоб розуміти, які матеріали корисні. Ви можете продовжити без аналітики.

Ви можете змінити свій вибір у будь-який час.