Laravel Eloquent, PHP ekosistemindeki en güçlü ve ifade edici ORM sistemlerinden biridir. Ancak, birçok geliştirici Eloquent’in sunduğu tüm özelliklerin yalnızca yüzeyine dokunmaktadır.
Bu makale, profesyonel geliştiricilerin daha temiz, hızlı ve ölçeklenebilir uygulamalar geliştirmek için kullandığı gelişmiş Laravel Eloquent ipuçlarını ve en iyi uygulamaları kapsamaktadır.
1. N+1 Sorgu Probleminden Kaçının
1. N+1 Sorgu Probleminden Kaçının
Laravel uygulamalarındaki en yaygın performans sorunlarından biri N+1 sorgu problemidir.
Kötü Uygulama
$posts = Post::all();
foreach ($posts as $post) {
echo $post->user->name;
}Bu durum birden fazla veritabanı sorgusuna neden olur.
En İyi Uygulama
$posts = Post::with('user')->get();Eager loading, veritabanı sorgularının sayısını önemli ölçüde azaltır ve performansı artırır.
2. Yalnızca Gerekli Sütunları Seçin
2. Yalnızca Gerekli Sütunları Seçin
Gereksiz sütunları almak, bellek kullanımını artırır ve sorguları yavaşlatır.
Kötü Uygulama
User::all();En İyi Uygulama
User::select('id', 'name', 'email')->get();Sadece gerçekten ihtiyaç duyduğunuz verileri alın.
3. Büyük Verileri Chunking ile İşleyin
3. Büyük Verileri Chunking ile İşleyin
Büyük veri setlerini aynı anda yüklemek uygulamanızı çökertme riski taşır.
En İyi Uygulama
User::chunk(100, function ($users) {
foreach ($users as $user) {
// kullanıcıyı işleyin
}
});Chunking, bellek kullanımını düşürür ve arka plan görevleri ve cron işleri için idealdir.
4. Gelişmiş İlişkileri Kullanın
4. Gelişmiş İlişkileri Kullanın
Profesyonel uygulamalar genellikle karmaşık ilişkiler gerektirir:
- hasOneThrough
- hasManyThrough
- polimorfik ilişkiler
Örnek:
public function comments()
{
return $this->morphMany(Comment::class, 'commentable');
}Bu ilişkiler, veritabanı tasarımının temiz ve ölçeklenebilir olmasına yardımcı olur.
5. Temiz Kod için Sorgu Kapsamlarını Kullanın
5. Temiz Kod için Sorgu Kapsamlarını Kullanın
Koşulları tekrar etmek yerine sorgu kapsamlarını kullanın.
User::active()->admin()->get();public function scopeActive($query)
{
return $query->where('status', 'active');
}Kapsamlar, sorguları okunabilir ve yeniden kullanılabilir hale getirir.
6. Toplu Atamaya Karşı Koruma Sağlayın
6. Toplu Atamaya Karşı Koruma Sağlayın
Kullanıcı girdilerine körü körüne güvenmeyin.
Kötü Uygulama
User::create($request->all());En İyi Uygulama
protected $fillable = ['name', 'email'];veya
protected $guarded = ['is_admin'];Bu, yetkisiz veri değiştirmenin önüne geçer.
7. count() Yerine exists() Kullanın
7. count() Yerine exists() Kullanın
Kötü Uygulama
User::where('email', $email)->count();En İyi Uygulama
User::where('email', $email)->exists();exists() bir eşleşme bulunduğu anda sorguyu durdurur, bu da daha hızlıdır.
8. İlişki Sayımları için withCount() Kullanın
8. İlişki Sayımları için withCount() Kullanın
Kötü Uygulama
$post->comments->count();En İyi Uygulama
Post::withCount('comments')->get();Bu, tüm ilişkileri gereksiz yere yüklemekten kaçınır.
9. Kayıtları Yüklemeden Güncelleyin
9. Kayıtları Yüklemeden Güncelleyin
Kötü Uygulama
$user = User::find($id);
$user->status = 'active';
$user->save();En İyi Uygulama
User::where('id', $id)->update(['status' => 'active']);Bu, veritabanı sorgularını azaltır.
10. firstOrCreate ve updateOrCreate Kullanın
10. firstOrCreate ve updateOrCreate Kullanın
User::firstOrCreate(
['email' => $email],
['name' => $name]
);Bu yöntemler, mantığı basitleştirir ve yarış koşullarını önler.
11. Attribute Casting Kullanın
11. Attribute Casting Kullanın
protected $casts = [
'is_active' => 'boolean',
'settings' => 'array',
'email_verified_at' => 'datetime',
];Casting, uygulamanız boyunca tutarlı veri türleri sağlar.
12. Hassas Alanları Yanıtlarınızda Gizleyin
12. Hassas Alanları Yanıtlarınızda Gizleyin
protected $hidden = [
'password',
'remember_token',
];Bu, API güvenliği için çok önemlidir.
13. Veritabanı İşlemlerini Kullanın
13. Veritabanı İşlemlerini Kullanın
DB::transaction(function () {
Order::create([...]);
Payment::create([...]);
});İşlemler, kritik işlemlerde kısmi veri bozulmasını önler.
14. DB::raw() Kullanımını Aşırıya Kaçmaktan Kaçının
14. DB::raw() Kullanımını Aşırıya Kaçmaktan Kaçının
Ham sorgular, okunabilirliği azaltır ve güvenlik risklerini artırır. Mümkün olan her yerde Eloquent kullanın.
15. Sorguları İzleyin ve Optimize Edin
15. Sorguları İzleyin ve Optimize Edin
DB::listen(function ($query) {
logger($query->sql);
});Düzenli sorgu izleme, performans darboğazlarını erken tanımlamaya yardımcı olur.
Kaynak: Orijinal Makale
- 1. N+1 Sorgu Probleminden Kaçının
- 2. Yalnızca Gerekli Sütunları Seçin
- 3. Büyük Verileri Chunking ile İşleyin
- 4. Gelişmiş İlişkileri Kullanın
- 5. Temiz Kod için Sorgu Kapsamlarını Kullanın
- 6. Toplu Atamaya Karşı Koruma Sağlayın
- 7. count() Yerine exists() Kullanın
- 8. İlişki Sayımları için withCount() Kullanın
- 9. Kayıtları Yüklemeden Güncelleyin
- 10. firstOrCreate ve updateOrCreate Kullanın
- 11. Attribute Casting Kullanın
- 12. Hassas Alanları Yanıtlarınızda Gizleyin
- 13. Veritabanı İşlemlerini Kullanın
- 14. DB::raw() Kullanımını Aşırıya Kaçmaktan Kaçının
- 15. Sorguları İzleyin ve Optimize Edin


