Laravel Query Builder i Eloquent ORM – šta odabrati?
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.
