Lokalne scope’y w Laravelu: czystsze zapytania Eloquent

Lokalne scope’y w Laravelu: czystsze zapytania Eloquent
Scope’y w Laravelu bardzo się przydają, kiedy to samo zapytanie trzeba uruchomić więcej niż raz. Sprawiają też, że zapytania łatwiej się czyta i utrzymuje.

Jeśli jeszcze nie znasz scope’ów Laravela, to tutorial w sam raz dla ciebie 😉.

Czym są scope’y

Laravel ma dwa rodzaje scope’ów: globalne i lokalne. Żeby nie komplikować, omówię tu tylko te lokalne, ale przy okazji zajrzyj też do scope’ów globalnych.

Czym więc jest lokalny scope zapytania w Laravelu? Dobrze, że pytasz. Oto przykład lokalnego scope’a w modelu użytkownika:

php
<?php

namespace App;

use IlluminateDatabaseEloquentModel;

class User extends Model
{
    public function scopeAdmin($query)
    {
        return $query->where('admin', 1);
    }
}

W powyższym kodzie metoda scopeAdmin zwraca $query, w którym kolumna admin ma wartość 1. Skoro wiesz już, jak wygląda lokalny scope, zobaczmy, jak go użyć.

Jak używać scope’ów

Żeby wykorzystać nasz scopeAdmin w projekcie i dostać kolekcję użytkowników z uprawnieniami administratora, wystarczy napisać tyle:

php
$admins = User::admin()->all();

To zwróci nam każdego admin z bazy danych.

Mam nadzieję, że już widać, jak potężne to narzędzie, ile czasu oszczędzają scope’y i o ile czytelniejszy robi się dzięki nim kod. Jeśli nadal cię nie przekonały, czytaj dalej, zaraz zobaczysz przykład, który pokazuje, jak ułatwiają życie.

Po co używać scope’ów

Wróćmy do poprzednich przykładów. Powiedzmy, że chcemy zmienić zapytanie tak, żeby zwracało wyłącznie wiersze admin, w których kolumna active ma wartość 1. Bez scope’ów w aplikacji trzeba by wytropić w całym kodzie każde wystąpienie tego zapytania:

php
$admins = User::where('admin', 1)->all();

I zastąpić je tym:

php
$admins = User::where('admin', 1)->where('active', 1)->all();

Ze scope’ami wystarczy natomiast zmienić sam scope:

php
public function scopeAdmin($query)
{
    return $query->where('admin', 1)->where('active', 1);
}

Wszystkie istniejące zapytania zwrócą wtedy użytkowników admin, u których active wynosi 1. Jak widać, kod robi się wydajniejszy, łatwiejszy w utrzymaniu i czytelniejszy.

Podsumowanie

Używanie scope’ów w aplikacji Laravel przenosi logikę do modeli Eloquent, zamiast rozsiewać ją po widokach i kontrolerach. Dzięki temu projekt łatwiej się utrzymuje i czyta.

Mam nadzieję, że ten artykuł pozwolił ci lepiej zrozumieć scope’y Laravela i że sięgniesz po nie w kolejnych projektach ✌️.

Laravel

Damien Flandrin Web developer od 2010 roku, twórca Gekkode i Email Impact. Każdy artykuł jest sprawdzany na prawdziwym projekcie przed publikacją. Kontakt
Newsletter

Nowe testy, poradniki i projekty — e-mailem.

Powtarzalne testy, wersjonowany kod, datowane wyniki. Nigdy spamu.