Laravel güçlü bir sorgu oluşturma aracı olan Elequent adlı büyük bir veritabanı mekanizmasına sahip. Ancak bazen raw sorgular şeklinde düz sql kullanmak daha mantıklıdır. Bu yazıda size en yaygın kullanımları göstereceğim . Keyifli okumalar.
1.Sık kullanılan: selectRaw() ile Avg/Sum/Count Hesaplamaları
Eğer groupBy() uygulayıp, ardından mysql üzerindeki bazı fonksiyonları kullanmak isterseniz(AVG() veya COUNT gibi) söz konusu bölüm için raw sorgu kullanmak daha mantıklıdır.
Laravel dökümantasyonundan bir örnek verelim:
Başka bir örnek:
$products = DB::table('products')->leftjoin('category','category.product_id','=','products.id')->selectRaw('COUNT(*) as nbr', 'products.*')->groupBy('products.id')->get();
Hatta avg() ve count() işlemlerini aynı ifadede bile kullanabiliriz:
$salaries = DB::table('salaries')->selectRaw('companies.name as company_name, avg(salary) as avg_salary, count(*) as people_count')->join('companies', 'salaries.company_id', '=', 'companies.id')->groupBy('companies.id')->orderByDesc('avg_salary')->get();
2. Yılları Filtreleme: groupByRaw, orderByRaw ve havingRaw
Peki bazı groupBy veya orderBy yerine bazı SQL hesaplamaları kullanırsak ne olur ?
Bunun için groupByRaw() ve orderByRaw() gibi yöntemlerimiz var. Ayrıca SQL ifadesini havingRaw() ile “alarak”, gruplama sonrası “where” ifadesini de kullanabiliriz.
Örnek olarak, belli bir tarih/saat alanını, gruplayarak nasıl alırız ?
3. Alt sorgu ile bir alanı hesaplama: selectRaw()
Eğer
sutunlar arasındaki hesaplama işlemlerinden özel olarak belli bir
sütunu almak, ve bu hesaplamayı SQL sorgusu ile yapmak istiyorsanız
şöyle bir şey yapmanız gerekecek:
Başka bir örnek — SQL deki CASE ifadesi:
4. Eski SQL sorgularında DB:select() kullanın
Oldukça
sık karşılışan bir örnek iste bazı eski projelerinizdeki SQL
ifadeleriniz olduğunda, bunu Eloquent veya Query Builder yapısına
dönüştürmeniz gerekmektedir.
Fakat buna hiç gerek yok. DB:select() mükemmel derecede kullanışlı bir ifadedir.
5. Genellikle Migrasyonlarda Kullanılan: DB:statement() ifadesi
Eğer
herhangi bir sonuç üzerinde işlem yapmadan bazı SQL sorgularını
çalıştırmaya ihtiyacınız varsa(örnek olarak INSERT veya UPDATE gibi
parametlere olmadan) DB:statement() yapısını kullanabilirsiniz.
DB:statement()
ifadesi deneyimlerime göre bazı tablo yapısı değişikliklerinde ve eski
verilerin yeni yapı ile güncellemesi gerektiğinde, veritabanı
migrasyonlarında sıklıkla kullanılır.
Ayrıca DB:statement() ifadesini sütun veya değerlerin dışında herhangi bir SQL sorgu şemasıyla kullanabilirsiniz.
Örnek olarak:
Dikkat: parametrelere dikkat edin ve her zaman doğrulayın
Son olarak ufak bir not daha;
Raw Sorgularda daki en büyük tehlike, otomatik olarak denetlenmemeleridir. Bu nedenle herhangi bir sorguda parameter kullanıyorsanız lütfen en az 3 defa kontrol edin ve doğru formatlara(sayı ve string olmadığı gibi) sahip olduğundan emin olun.
Kaynak: https://quickadminpanel.com/blog/5-ways-to-use-raw-database-queries-in-laravel/
1.Sık kullanılan: selectRaw() ile Avg/Sum/Count Hesaplamaları
Eğer groupBy() uygulayıp, ardından mysql üzerindeki bazı fonksiyonları kullanmak isterseniz(AVG() veya COUNT gibi) söz konusu bölüm için raw sorgu kullanmak daha mantıklıdır.
Laravel dökümantasyonundan bir örnek verelim:
Kod:
$users = DB::table(‘users’)
->selectRaw(‘count(*) as user_count, status’)
->where(‘status’, ‘<>’, 1)
->groupBy(‘status’)
->get();
$products = DB::table('products')->leftjoin('category','category.product_id','=','products.id')->selectRaw('COUNT(*) as nbr', 'products.*')->groupBy('products.id')->get();
Hatta avg() ve count() işlemlerini aynı ifadede bile kullanabiliriz:
$salaries = DB::table('salaries')->selectRaw('companies.name as company_name, avg(salary) as avg_salary, count(*) as people_count')->join('companies', 'salaries.company_id', '=', 'companies.id')->groupBy('companies.id')->orderByDesc('avg_salary')->get();
2. Yılları Filtreleme: groupByRaw, orderByRaw ve havingRaw
Peki bazı groupBy veya orderBy yerine bazı SQL hesaplamaları kullanırsak ne olur ?
Bunun için groupByRaw() ve orderByRaw() gibi yöntemlerimiz var. Ayrıca SQL ifadesini havingRaw() ile “alarak”, gruplama sonrası “where” ifadesini de kullanabiliriz.
Örnek olarak, belli bir tarih/saat alanını, gruplayarak nasıl alırız ?
Kod:
$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();
Eğer
sutunlar arasındaki hesaplama işlemlerinden özel olarak belli bir
sütunu almak, ve bu hesaplamayı SQL sorgusu ile yapmak istiyorsanız
şöyle bir şey yapmanız gerekecek:
Kod:
$products = Product::select('id', 'name')->selectRaw('price - discount_price AS discount')->get();
Kod:
$users = DB::table('users')->select('name', 'surname')->selectRaw("(CASE WHEN (gender = 1) THEN 'Erkek' ELSE 'Kadın' END) as gender_text")->get();
Oldukça
sık karşılışan bir örnek iste bazı eski projelerinizdeki SQL
ifadeleriniz olduğunda, bunu Eloquent veya Query Builder yapısına
dönüştürmeniz gerekmektedir.
Fakat buna hiç gerek yok. DB:select() mükemmel derecede kullanışlı bir ifadedir.
5. Genellikle Migrasyonlarda Kullanılan: DB:statement() ifadesi
Eğer
herhangi bir sonuç üzerinde işlem yapmadan bazı SQL sorgularını
çalıştırmaya ihtiyacınız varsa(örnek olarak INSERT veya UPDATE gibi
parametlere olmadan) DB:statement() yapısını kullanabilirsiniz.
DB:statement()
ifadesi deneyimlerime göre bazı tablo yapısı değişikliklerinde ve eski
verilerin yeni yapı ile güncellemesi gerektiğinde, veritabanı
migrasyonlarında sıklıkla kullanılır.
Kod:
DB::statement('UPDATE users SET role_id = 1 WHERE role_id IS NULL AND YEAR(created_at) > 2020');
Örnek olarak:
Kod:
DB::statement('DROP TABLE users');DB::statement('ALTER TABLE projects AUTO_INCREMENT=123');
Son olarak ufak bir not daha;
Raw Sorgularda daki en büyük tehlike, otomatik olarak denetlenmemeleridir. Bu nedenle herhangi bir sorguda parameter kullanıyorsanız lütfen en az 3 defa kontrol edin ve doğru formatlara(sayı ve string olmadığı gibi) sahip olduğundan emin olun.
Kaynak: https://quickadminpanel.com/blog/5-ways-to-use-raw-database-queries-in-laravel/
