WEB-Программист
Przełącz nawigację

Język

  • Українська
  • Русский
  • Polski
  • Українська
  • Русский
  • Polski
Skontaktuj się z nami

Szukaj

  • Books
  • Bez kategorii
  • wordpress [PL]
  • Czcionki
  • Laravel [PL]
  • Articles
  • wordpress [PL]
  • © 2015-2026 Andrii Beznosko

  • Hosting CityHost

Praca z polami nullable w Eloquent w Laravel

  • Opis
  • Opis/Pobieranie

Laravel

Wstęp

Jeśli masz w Laravel kilka modeli z jednym polem nullable, tworzenie mutatora dla tego pola jest procesem dość trywialnym:

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

 

Tutaj sprawdzamy dane wejściowe, w tym przypadku $nickname, pod kątem pustki. Jeśli$nickname jest puste, to ustawiamy atrybutowi wartość null, w przeciwnym razie — trim($nickname).

Dlaczego używam trim zamiast empty? Funkcja trim usuwa znaki białe z początku i końca ciągu, a porównanie wyniku jej działania z pustym ciągiem pozwala sprawdzić, czy dane wejściowe są rzeczywiście puste. Dzięki temu możemy upewnić się, że nikt nie próbuje wstawić do bazy danych pustego ciągu. A empty uznaje dowolną liczbę znaków białych za niepusty ciąg.

Jednak przy kilku modelach z polami tego typu w bazie danych pojawia się duplikacja kodu; w każdym takim modelu trzeba ustawiać mutator sprawdzający pustkę. Czy to rzeczywiście najlepszy sposób działania? Widzę dwa sposoby usunięcia duplikacji kodu w tym przypadku, a wybór zależy od Twojego środowiska (serwera).

Użycie modelu bazowego

Jeśli masz w Laravel kilka metod z powtarzalną logiką w modelach, możesz przenieść ją (tę logikę) do modelu bazowego, z którego będą rozszerzane pozostałe modele. Jest to przydatne, jeśli w każdym z Twoich modeli będzie wykorzystywana metoda nullIfEmpty (w naszym przypadku). Jednak rozszerzanie modelu bez używania jego metod może powodować niepotrzebne dodatkowe zużycie zasobów.

<?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);
    }

}

 

Funkcja nullIfEmpty będzie dostępna w każdym modelu rozszerzającym BaseModel:

<?php namespace App;

class UserModel extends BaseModel {

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

}

 

Ten sposób działa, ale nie od razu jest jasne, skąd pochodzi metoda nullIfEmpty. Potrzeba trochę czasu, aby ustalić, skąd się wzięła. Mimo to tę niejasność można uniknąć.

Jednak dla osób, które mają wersję PHP < 5.4.0, ten sposób prawdopodobnie będzie jedynym.

Użycie traitów

Jeśli używasz wersji PHP >= 5.4.0, traity pomogą Ci w elegancki, deklaratywny sposób dodać do modelu potrzebną funkcjonalność.

<?php namespace AppTraits;

trait NullableFields {

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

}

 

Tego traitu można użyć w modelu w następujący sposób:

<?php namespace App;

use AppTraitsNullableFields;
use IlluminateDatabaseEloquentModel;

class UserModel extends Model {

    use NullableFields;

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

}

 

Wnioski

Osobiście nie uważam, aby którykolwiek z tych metod był szybszy; obie są też proste w użyciu. Dlatego wybór w każdym przypadku należy do Ciebie. Użycie traitów w Laravel jest bardziej deklaratywne, ponieważ od razu widzisz NullableFields w klasie i nie musisz szukać, skąd przyszedł dany metod.

Ale moim zdaniem użycie traitów jest bardziej preferowane, ponieważ nie obciążasz modelu metodami do obsługi danych wejściowych ani żadnymi innymi metodami, które nie mają z nim bezpośredniego związku. Przeciążanie klasy to nie najlepszy pomysł.

Comments
Łącznie komentarzy: 0
Dodaj komentarz Anuluj odpowiedź

Twój adres e-mail nie zostanie opublikowany.

Kategoria: Главная » Laravel » Praca z polami nullable w Eloquent w Laravel
Status: Для продвинутых программистов
Original article link (if specified or if this article is not authored by us) Download
Submitted by kwi 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

Zobacz też:

Praca z polami nullable w Eloquent w Laravel

Wstęp Jeśli masz w Laravel kilka modeli z jednym polem nullable, tworzenie mutatora dla tego pola jest procesem dość trywialnym: public function setNicknameAttribute($nickname) { $this->attributes['nickname'] = trim($nickname) == '' ? null : trim($nickname); }   Tutaj sprawdzamy dane wejściowe, w...

Rozszerzamy klasy Laravel metodą `orAbort` za pomocą traitu

Zainspirowany artykułem Edd Man's o opcjonalnych kontrolnych przepływach, stworzyłem mały pakiet do Laravel, który realizuje opcjonalne zatrzymanie aplikacji. Udostępnia on trait SpatieOrAbortOrAbort, który może być używany z dowolną klasą. Do wszystkich metod klasy dodawana jest funkcjonalność orAbort. Gdy oryginalna metoda...

DDD Ultra-Light

Niektórzy ludzie mówią, że DDD jest trudne, kosztowne i powinno być stosowane z ostrożnością. Niektóre zespoły praktykują „DDD Life” — używają wzorców projektowania aplikacji opisanych przez Erica Evansa w dużej niebieskiej książce, ale ignorują idee, które uważa się za naprawdę...

Tworzenie pakietów dla Laravel

Prosper Otemuyiwa niedawno opublikował artykuł o tym, jak tworzyć pakiety dla Laravel 5 na swoim blogu. Chociaż jego sposób jest w pełni poprawny i może ci odpowiadać, ja wolę nieco inny sposób tworzenia pakietów. Na początku tworzę nowe repozytorium na...

Skontaktuj się z nami

- Motywy i wtyczki premium WP Star za darmo -

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