• Czas czytania ~2 min
  • 09.06.2022

Jeśli pracujesz z Laravelem od jakiegoś czasu, prawdopodobnie znasz standardowe metody tworzenia modeli elokwentnych, takie jak make(), , , create()updatei save(). Laravel zawiera kilka innych metod, które są również bardzo przydatne do tworzenia i aktualizowania modeli, które moim zdaniem nie przyciągają wystarczającej uwagi. W tym artykule chciałbym omówić niektóre z tych dodatkowych metod i wyjaśnić, w jaki sposób mogą być przydatne.

firstOrNew

Metoda firstOrNew jest bardzo przydatna do znalezienia pierwszego modelu, który pasuje do niektórych ograniczeń lub utworzenia nowego, jeśli nie ma takiego, który pasuje do tych ograniczeń.

Możesz wziąć fragment kodu, który wygląda tak: I zamień go w to:Możesz również przekazać tablicę dodatkowych atrybutów, aby ustawić jako drugi parametr, jeśli nie zostanie znaleziony żaden istniejący model:

$user = User::where('email', request('email'))->first();

if ($user === null) {
    $user = new User(['email' => request('email')]);
}
$user->name = request('name');

$user->save()

$user = User:: firstOrNew(['email' =>  request('email')]);

$user->name = request('name');

$user->save()

$user = User:: firstOrNew(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
$user->save();

firstOrCreate

Metoda firstOrCreate jest bardzo podobna do firstOrNew metody. Próbuje znaleźć model pasujący do atrybutów przekazanych w pierwszym parametrze. Jeśli model nie zostanie znaleziony, automatycznie tworzy i zapisuje nowy model po zastosowaniu dowolnych atrybutów przekazanych w drugim parametrze:

$user = User:: firstOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
// No call to $user->save() needed

firstOr

I recently found the firstOr method while source-diving. The firstOr method retrieves the first Model from a query, or if no matching Model is found, it will call a callback passed. This can be really useful if you need to perform extra steps when creating a user or want to do something other than creating a new user:

$user = User::where('email', request('email'))-> firstOr(function () {
    $account = Account::create([ //... ]);

    return User::create([
        'account_id' => $account->id,
        'email' => request('email'),
    ]);
});

updateOrCreate

Metoda updateOrCreate próbuje znaleźć model pasujący do ograniczeń przekazanych jako pierwszy parametr. Jeśli zostanie znaleziony pasujący model, zostanie on zaktualizowany o atrybuty przekazane jako drugi parametr. Jeśli nie zostanie znaleziony pasujący model, zostanie utworzony nowy model z ograniczeniami przekazanymi jako pierwszy parametr i atrybutami przekazanymi jako drugi parametr.

Możesz refaktoryzować ten fragment kodu:Do tego za pomocą updateOrCreate metody:

$user = User::where('email', request('email'))->first();

if ($user !== null) {
    $user->update(['name' => request('name')]);
} else {
    $user = User::create([
      'email' => request('email'),
      'name' => request('name'),
    ]);
}
// Do other things with the User

$user = User::updateOrCreate(
    ['email' =>  request('email')],
    ['name' => request('name')]
);
// Do other things with the User

Wniosek

Ogólnie rzecz biorąc, myślę, że te metody mogą pomóc w oczyszczeniu kodu w pewnych okolicznościach i są świetnymi opcjami, które można mieć w pasku narzędzi! Daj mi znać, jeśli znasz jakieś inne, które są naprawdę przydatne i nie są dobrze znane. Uwielbiam poznawać te drobne szczegóły, które sprawiają, że praca z Laravelem jest tak przyjemna.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297