Tehnologija Vodič

Laravel Query Builder i Eloquent ORM – šta odabrati?

query builder

Laravel je poznat po tome što vam pruža više načina za rad sa bazom podataka. Dva glavna pristupa su Query Builder i Eloquent ORM.

Obe navedene opcije imaju svoje prednosti i namenjene su različitim vrstama zadataka.

Zato ćemo u ovom tekstu objasniti osnovne razlike između ova dva sistema, pokazati konkretne primere njihove primene i dati neke korisne savete kada je bolje koristiti jedan ili drugi pristup.

Šta je Laravel Query Builder?

Query Builder je sloj apstrakcije koji vam omogućava da pišete SQL upite u PHP-u, bez potrebe da ručno pišete sirovi SQL. On koristi fluentni interfejs i vraća instancu klase Illuminate\Database\Query\Builder. U suštini, koristi se kada želite potpunu kontrolu nad SQL upitima, ali ne želite da ih pišete kao običan tekst. Glavne prednosti Query Buildera su što je on jednostavan, brz i precizan.

Evo i nekoliko primera koji potkrepljuju ovu tvrdnju.

Primer selektovanja podataka:

$usernames = DB::table('users')->select('name')->get(); // Get usernames only

Primer spajanja tabela (JOIN):

$orders = DB::table('orders')

    ->join('users', 'orders.user_id', '=', 'users.id')

    ->select('orders.id', 'users.name', 'orders.created_at')

    ->get(); // Get orders with user names

Primer naprednog WHERE uslova:

$activeAdmins = DB::table('users')

    ->where('role', 'admin')

    ->where('active', true)

    ->get(); // Get active users with admin role

Primer agregatne funkcije:

$totalPostsPerUser = DB::table('posts')

    ->select('user_id', DB::raw('count(*) AS post_count'))

    ->groupBy('user_id')

    ->get(); // Get post count per user

Primer sa sirovim SQL izrazima:

$userWithFullName = DB::table('users')

    ->select(DB::raw('CONCAT(first_name, " ", last_name) AS full_name'))

    ->where('id', 1)

    ->first(); // Get the user full name as a single column

Primer umetanja (INSERT):

$data = [

    'name' => 'John Doe',

    'email' => 'john.doe@example.com',

    'created_at' => now(),

];

DB::table('users')->insert($data); // Insert a new user

Primer ažuriranja (UPDATE):

$data = [

    'email' => 'new_email@example.com',

];

DB::table('users')

    ->where('id', 1)

    ->update($data); // Update user with ID 1

Primer brisanja (DELETE):

DB::table('posts')

    ->where('created_at', '<', now()->subWeek())

    ->delete(); // Delete posts older than a week

Primer spajanja rezultata (UNION):

$popularPosts = DB::table('posts')

    ->where('views', '>', 1000);

$recentPosts = DB::table('posts')

    ->orderBy('created_at', 'desc')

    ->limit(5);

$allPosts = $popularPosts->union($recentPosts)->get(); // Combine popular and recent posts

Šta je Eloquent ORM?

Eloquent ORM (Object-Relational Mapping) je napredniji sloj apstrakcije koji omogućava rad sa bazom putem PHP objekata. Svaka tabela u bazi podataka mapira se na posebnu klasu, a redovi se predstavljaju kao objekti te klase.

Evo i nekoliko primera primene Eloquent ORM-a:

Dohvatanje svih korisnika:

$users = User::all();

Dodavanje novog korisnika:

$user = new User;

$user->name = 'John Doe';

$user->email = 'john.doe@example.com';

$user->save();

Ažuriranje korisnika:

$user = User::find(1);

$user->name = 'Jane Doe';

$user->save();

Brisanje korisnika:

$user = User::find(2);

$user->delete();

Relacija jedan-na-jedan (hasOne):

// User model

public function profile()

{

    return $this->hasOne(Profile::class);

}

$profile = User::find(1)->profile;

Eager loading:

$users = User::with('posts')->get(); // Fetch users with their posts in one query

Model događaji (npr. hash lozinke pre snimanja):

// User model

public static function boot()

{

    parent::boot();

    static::creating(function($user) {

        $user->password = Hash::make($user->password);

    });

}

Lokalni scope:

// User model

public function scopeActive($query)

{

    return $query->where('active', true);

}

$activeUsers = User::active()->get(); // Fetches active users using the scope

Kada koristiti koji pristup?

Ako radite nešto jednostavno, poput agregatnih funkcija (npr. count, sum), filtriranja, paginacije ili kombinovanja tabela bez potrebe za relacijama i modelima, Query Builder je brži i efikasniji izbor. Daje vam punu kontrolu nad SQL-om i manje troši memoriju jer ne instancira objekte.

Ako vaš projekat zahteva stabilnu strukturu podataka, složene relacije, validaciju i poslovnu logiku unutar modela, Eloquent ORM je daleko pogodniji. On omogućava elegantan rad sa povezanim tabelama, hijerarhijama modela, automatskim događajima i čini kod mnogo čitljivijim i organizovanijim.

Na primer, u situacijama kada imate blog sistem sa autorima, postovima, komentarima i kategorijama, Eloquent omogućava prirodan i objektno-orijentisan način upravljanja svim tim vezama. A kada vam je potreban statistički izveštaj, brz izračun suma, proseka ili filtriranje velikih setova podataka, Query Builder vam nudi direktan pristup optimizovanim SQL pozivima.

Zaključak

Eloquent ORM i Query Builder nisu konkurencija jedan drugome, jer su u pitanju različiti alati za različite potrebe. Eloquent je elegantniji, čitljiv i savršen za rad sa složenim strukturama i relacijama. Query Builder je brz, lagan i precizan, odličan za izvlačenje velikih količina podataka i rad sa sirovim vrednostima.

U idealnom slučaju možete da koristite oba, a tamo gde vam je potrebna brzina i jednostavnost, posegnite za Query Builder-om. Kada razvijate aplikaciju sa kompleksnom poslovnom logikom, modelima i vezama među tabelama, Eloquent ORM će vam uštedeti mnogo vremena i učiniti kod preglednijim i skalabilnijim.

Na kraju, razumevanje oba pristupa daje vam slobodu da birate najbolji alat za svaki zadatak, bilo da se radi o jednostavnom izvlačenju podataka ili kompleksnom web sistemu koji koristi desetine tabela i veliki broj međusobnih veza.

Ostavi komentar

Vaša adresa neće biti objavljena