Laravel Raw SQL Queries bir Laravel projesinde direk SQL sorgularını kullanmanıza olanak tanır. Bunun yerine Eloquent veritabanı sistemi kullanmak daha yaygın olarak kullanılır, ancak bazı durumlarda raw SQL sorguları daha uygun ve hızlı sonuç verebilir.
Laravel Raw Queries Kullanımı
Laravel’de raw SQL sorgularını kullanmak için “DB” sınıfını kullanabilirsiniz. Örneğin, veritabanından veri çekmek için aşağıdaki gibi bir sorgu yazabilirsiniz:
1 2 3 | $users = DB::select('select * from users'); |
yada
1 2 3 | $users = DB::table('users')->get(); |
Aynı şekilde, veritabanına veri eklemek için aşağıdaki gibi bir sorgu yazabilirsiniz:
1 2 3 | DB::insert('insert into users (name, email) values (?, ?)', [$name, $email]); |
yada
1 2 3 4 5 6 7 8 | $name = 'John Doe'; $email = 'johndoe@example.com'; DB::table('users')->insert( ['name' => $name, 'email' => $email] ); |
Controller içinde Laravel Raw Queries Kullanımı
Laravel raw SQL sorgularını kullanırken, güvenliğiniz için sorgularınızı zaman aşımı (SQL injection) gibi güvenlik açıklarından koruyun. Laravel, bu güvenlik açıklarına karşı koruyucu önlemler sunar ve sorgularınızı güvenli bir şekilde yürütmek için sorgularınızı otomatik olarak sanal verilerle değiştirir.
Laravel Raw SQL Queries, Laravel Controller içinde kullanımı oldukça basit bir şekildedir. Öncelikle “DB” methodunu kullanabileceğiniz namespace’i eklemeniz gerekmektedir.
Controller dosyasındaki bir fonksiyon içerisinde SQL Raw Queries kullanmak için aşağıdaki şekilde yapabilirsiniz:
1 2 3 4 5 6 7 8 9 10 | use Illuminate\Support\Facades\DB; public function index() { $users = DB::select('SELECT * FROM users'); return view('users', ['users' => $users]); } |
Bu örnekte, “users” tablosundaki tüm kayıtlar “users” değişkenine atanır ve daha sonra “users” isimli bir view’e gönderilir. Bu view içerisinde, “users” değişkenindeki kayıtları işleyebilirsiniz.
Route içinde Laravel Raw Queries Kullanımı
Laravel Route içinde de Laravel Raw SQL Queries kullanılabilir, ancak genellikle uygun değildir çünkü Route yapısı, controller veya model tarafından verilerin işlenmesi için daha uygun bir yerdir. Bununla birlikte, eğer gerekli ise Route içinde Raw SQL Queries kullanımı şu şekildedir:
1 2 3 4 5 6 7 8 9 | use Illuminate\Support\Facades\DB; Route::get('/raw', function () { $users = DB::select('SELECT * FROM users'); return view('users', ['users' => $users]); }); |
yada
1 2 3 4 5 6 7 8 9 | use Illuminate\Support\Facades\DB; Route::get('/raw', function () { $users = DB::table('users')->get(); return view('users', ['users' => $users]); }); |
Bu örnekte, “users” tablosundaki tüm kayıtlar “users” değişkenine atanır ve daha sonra “users” isimli bir view’e gönderilir. Route içinde Raw SQL Queries kullanmak uygun değilse bile, bu örnek size Route içinde Raw SQL Queries nasıl kullanabileceğinizi gösterir.
Model içinde Laravel Raw Queries Kullanımı
Laravel Raw SQL Queries, Laravel Model içinde de kullanılabilir. Model içinde Raw SQL Queries kullanmak, controller veya başka bir yerde kullanmaktan farklı olarak, modelde yapılan işlemlerin daha fazla sınıflandırılmasına ve yapılandırılmasına olanak tanır.
Model dosyasınızda Raw SQL Queries kullanmak için aşağıdaki şekilde yapabilirsiniz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | namespace App; use Illuminate\Support\Facades\DB; use Illuminate\Database\Eloquent\Model; class User extends Model { public static function getUsers() { return DB::select('SELECT * FROM users'); } } |
Bu örnekte, “User” modeli içinde “getUsers” adlı bir statik fonksiyon tanımlanmıştır. Bu fonksiyon, “users” tablosundaki tüm kayıtları döndürür.
Controller veya başka bir yerde, bu modelde tanımlı fonksiyonu aşağıdaki şekilde kullanabilirsiniz:
1 2 3 4 5 6 7 8 9 10 | use App\User; public function index() { $users = User::getUsers(); return view('users', ['users' => $users]); } |
Bu örnekte, “User” modelindeki “getUsers” fonksiyonu çağrılır ve dönen kayıtlar “users” değişkenine atanır. Daha sonra, bu değişken “users” isimli bir view’e gönderilir ve bu view içerisinde kayıtlar işlenebilir.
View içinde Laravel Raw Queries Kullanımı
View içinde Laravel Raw SQL Queries kullanmak uygun bir yaklaşım değildir ve uygulamanızın güvenliği, hızı ve performansı açısından iyileştirme yapmak için model veya controller tarafında yapılması önerilir. Model veya controller tarafındaki veri işleme işlemleri, daha sonra view tarafına geçirilir ve view içinde görüntülenir.
Aşağıdaki örnekte, veritabanından bir sorgu sonucunu alıp bu verileri view içinde görüntülemek için bir örnek yapılmıştır:
Controller tarafında:
1 2 3 4 5 6 7 8 9 10 11 12 | use Illuminate\Support\Facades\DB; class PageController extends Controller { public function index() { $pages = DB::select('SELECT * FROM pages'); return view('pages.index', compact('pages')); } } |
View tarafında:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <table> <thead> <tr> <th>ID</th> <th>Title</th> <th>Description</th> </tr> </thead> <tbody> @foreach($pages as $page) <tr> <td>{{ $page->id }}</td> <td>{{ $page->title }}</td> <td>{{ $page->description }}</td> </tr> @endforeach </tbody> </table> |
Bu örnekte, veritabanındaki pages
tablosundan veriler çekilir ve $pages
değişkenine atanır. Daha sonra, bu veriler pages.index
view içinde görüntülenir.
Laravel Raw Queries Örnekleri
Laravel Raw SQL Queries kullanmak için öncelikle “DB” methodunu kullanabileceğiniz namespace’i eklemeniz gerekmektedir.
1 2 3 | use Illuminate\Support\Facades\DB; |
Şimdi size bazı örnek Laravel Raw SQL Queries vermek istiyorum:
Örnek: Veritabanındaki tüm kayıtları çekmek için:
1 2 3 | $users = DB::select('SELECT * FROM users'); |
Örnek: Veritabanına yeni kayıt eklemek için:
1 2 3 | DB::insert('INSERT INTO users (name, email) VALUES (?, ?)', [$name, $email]); |
yada
1 2 3 | $users = DB::table('users')->get(); |
Örnek: Veritabanındaki bir kaydı güncellemek için:
1 2 3 | DB::update('UPDATE users SET name = ? WHERE id = ?', [$name, $id]); |
yada
1 2 3 4 5 6 7 8 | $name = 'Jane Doe'; $id = 1; DB::table('users') ->where('id', $id) ->update(['name' => $name]); |
Örnek: Veritabanındaki bir kaydı silmek için:
1 2 3 | DB::delete('DELETE FROM users WHERE id = ?', [$id]); |
yada
1 2 3 4 5 | $id = 1; DB::table('users')->where('id', '=', $id)->delete(); |
Örnek: İki tablo arasında “inner join” işlemi yapmak istiyorsanız aşağıdaki gibi bir kod yazabilirsiniz:
1 2 3 4 5 6 7 8 9 10 | $users = DB::table('users') ->join('posts', 'users.id', '=', 'posts.user_id') ->select('users.*', 'posts.title', 'posts.body') ->get(); foreach ($users as $user) { echo $user->name; } |
Örnek: Aynı şekilde, “left join” işlemi yapmak isterseniz aşağıdaki gibi bir kod yazabilirsiniz:
1 2 3 | $users = DB::select('select * from users left join posts on users.id = posts.user_id'); |
Örnek: Laravel Raw Queries içinde WHERE şartı eklemek oldukça basittir. Örnek olarak, “pages” tablosundaki tüm kayıtların “status” değeri “published” olanlarını seçmek istersek aşağıdaki gibi bir sorgu yazabiliriz:
1 2 3 4 5 6 7 8 9 | $pages = DB::table('pages') ->where('status', '=', 'published') ->get(); foreach ($pages as $page) { echo $page->title; } |
Bu sorgu, pages
tablosundaki tüm kayıtları tarar ve sadece “status” değeri “published” olanları döndürür. Burada ?
işareti placeholder olarak kullanılmıştır ve ikinci parametre olarak verilen ['published']
değeri bu placeholder’a atanır.
Örnek: Aşağıdaki örnek, “users” tablosundaki kullanıcıların şehirlerine göre gruplandırarak, her şehir için kullanıcı sayısının toplamını hesaplayan bir Laravel Raw SQL Query örneğidir:
1 2 3 4 5 6 7 8 9 | $users = User::selectRaw('city, COUNT(*) as total_users') ->groupBy('city') ->get(); foreach ($users as $user) { echo $user->city . ': ' . $user->total_users; } |
Bu sorguda, “city” alanına göre gruplama yapılmıştır ve her grup için kullanıcı sayısını hesaplayan “COUNT(*)” aggregate fonksiyonu kullanılmıştır. Sonuç olarak, her şehir için kullanıcı sayısının toplamını içeren bir dizi döndürür.
Örnek: Laravel’de veritabanı sorgularını yapmak için selectRaw
metodunu kullanabilirsiniz. Aşağıdaki örnekte, selectRaw
metodunu kullanarak veritabanındaki kullanıcıların isimlerinin ve e-postalarının sayısını alan bir SELECT sorgusu yapacağız:
1 2 3 4 5 6 7 8 9 | $users = DB::table('users') ->selectRaw('name, email, count(*) as total') ->get(); foreach ($users as $user) { echo $user->total . ' users have the email address ' . $user->email; } |
Örnek: Laravel’de, havingRaw
ve selectRaw
metodlarını kullanarak veritabanı sorgularını yapabilirsiniz. Aşağıdaki örnekte, veritabanındaki kullanıcıların şehirlerine göre gruplandığı ve her grup içinde en az 10 kullanıcı bulunan şehirlerin isimleri ve toplam kullanıcı sayılarını içeren bir SELECT sorgusu yapacağız:
1 2 3 4 5 6 7 8 9 10 11 | $users = DB::table('users') ->selectRaw('city, count(*) as total') ->groupBy('city') ->havingRaw('count(*) >= 10') ->get(); foreach ($users as $user) { echo $user->city . ' has ' . $user->total . ' users.'; } |
Örnek: Laravel’de selectRaw
metodunu kullanarak veritabanındaki verilere alt sorgular (sub-queries) ile erişebilirsiniz. Aşağıdaki örnekte, bir kullanıcının yazdığı tüm yazıların toplam yorum sayısını bulan bir SELECT sorgusu yapacağız:
1 2 3 4 5 6 7 8 9 10 | $users = DB::table('users') ->selectRaw('name, (SELECT COUNT(*) FROM comments WHERE comments.post_id = posts.id) as total_comments') ->join('posts', 'users.id', '=', 'posts.user_id') ->get(); foreach ($users as $user) { echo $user->name . ' has written posts with a total of ' . $user->total_comments . ' comments.'; } |
Örnek: Bu sorgu, 2000 yılından sonra doğan kullanıcıların doğum yıllarına göre gruplandığını ve her grup içinde kullanıcı sayısını içeren bir SELECT sorgusudur. selectRaw
metodu kullanarak, kullanıcıların doğum tarihlerinden yıl bilgisi alınır ve amount
adında bir sütun olarak eklenir. groupByRaw
metodu kullanarak, kullanıcılar doğum yıllarına göre gruplanır. havingRaw
metodu ile 2000 yılından sonra doğan kullanıcılar seçilir ve orderByRaw
metodu ile doğum yıllarına göre sıralanır. get
metodu ile veriler veritabanından çekilir ve $results
değişkenine atanır.
1 2 3 4 5 6 7 | $results = User::selectRaw('YEAR(birth_date) as year, COUNT(id) as amount') ->groupByRaw('YEAR(birth_date)') ->havingRaw('YEAR(birth_date) > 2000') ->orderByRaw('YEAR(birth_date)') ->get(); |
Bu örnekler size Laravel Raw SQL Queries kullanmanın temel yollarını gösterir. Ancak daha detaylı ve kompleks sorgular için daha fazla araştırma yapmanız gerekmektedir.
Yorum Yap