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

Мова

  • Українська
  • Русский
  • Polski
  • Українська
  • Русский
  • Polski
Зв'яжіться з нами

Пошук

  • Книги
  • wordpress [UK]
  • Laravel [UK]
  • Articles
  • Немає категорій
  • © 2015-2026 Andrii Beznosko

  • Hosting CityHost

Робота з 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 одразу в класі, і вам не потрібно шукати, звідки прийшов метод.

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

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

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

Категорія: Главная » Laravel » Робота з nullable-полями в Eloquent у Laravel
Статус: Для продвинутых программистов
Original article link (if specified or if this article is not authored by us) Download
Submitted by Кві 17, 2026 00:23 Andriy

Articles published on WEB-Программист are provided with source links. The site administration is not responsible for your use of these materials.

Laravel
Previous Next

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

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

Вступ Якщо у вас є кілька моделей у Laravel з одним nullable-полем, створення мутатора для цього поля — процес доволі тривіальний: public function setNicknameAttribute($nickname) { $this->attributes['nickname'] = trim($nickname) == '' ? null : trim($nickname); }   Тут ми перевіряємо вхідні...

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

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

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

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

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

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

We use cookies on our website to give you the most relevant experience by remembering your preferences and repeat visits. By clicking “Accept”, you consent to the use of ALL the cookies.
Cookie settingsACCEPT
Manage consent

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
SAVE & ACCEPT