• Uyarı

thread_prefix.5 5 Laravel Raw Komutu Kullanımı

impROS

Member
Yönetici
Laravel Artisan
#1

1 9f886rXqYvBSAsCW58Mo4w.png
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:
Kod:
$users = DB::table(‘users’)

->selectRaw(‘count(*) as user_count, status’)

->where(‘status’, ‘<>’, 1)

->groupBy(‘status’)

->get();
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 ?
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();
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:
Kod:
$products = Product::select('id', 'name')->selectRaw('price - discount_price AS discount')->get();
Başka bir örnek — SQL deki CASE ifadesi:

Kod:
$users = DB::table('users')->select('name', 'surname')->selectRaw("(CASE WHEN (gender = 1) THEN 'Erkek' ELSE 'Kadın' END) as gender_text")->get();
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.

Kod:
DB::statement('UPDATE users SET role_id = 1 WHERE role_id IS NULL AND YEAR(created_at) > 2020');
Ayrıca DB:statement() ifadesini sütun veya değerlerin dışında herhangi bir SQL sorgu şemasıyla kullanabilirsiniz.

Örnek olarak:

Kod:
DB::statement('DROP TABLE users');DB::statement('ALTER TABLE projects AUTO_INCREMENT=123');
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/