Tasarım Kodlama

Doctrine ile Join Nasıl Yapılır?

Çok basit bir şey gibi görünüyor değil mi? Sonuçta, bunu SQL’de yaparsak böyle. Ancak Doctrine kullanıyorsanız, yapılacak doğru şey ORM’nin yeteneklerini kullanmaktır.

Geçenlerde bir müşteri veri tabanı ile ilgili çalışıyordum. Veritabanında mükerrer kayıtlar vardı ve bunları ortadan kaldırmak gerekiyordu.

Mesele şu ki, tüm kayıtların silinmesi gerekmiyor, sadece sorunlu olanları kaldırmam gerekiyordu.

Yapmam gereken, diğer filtre kriterlerinin yanı sıra belirli bir sağlayıcıya ait olan işlemleri ortadan kaldırmaktı.

Bunu yapmamın yolu, gerekli tüm nesneleri bulan ve ardından bunları kaldıran bir sorgu kullanmaktı:

Veri modeli şuna benzer:

Şimdiye kadar, yalnızca zorunlu filtreler (Temelde tarihler) dahil olmak üzere genel sorgu oluşturuldu.

Ardından, filtreyi sağlayıcıya göre kullanmak istiyorsanız, elimizde:

Her şey normal, değil mi?

İşte, sorunlar burada başladı.

Uygulama ekranından tarih aralığına ve sağlayıcıya karşılık gelen kayıt sayısını kontrol etmeye gittiğimde 3000’e yakın sağlayıcı buldum, ancak script bana yaklaşık 100.000 işlemi sileceğini söylüyordu.

Bu yüzden, yürütmek üzere olduğu SQL’i görüntülemek için betiğe bir seçenek eklemeye karar verdim ve şunu buldum:

Yine SQL’e bakarak bir süre kaldım. Her şey iyi görünüyordu.

Ne oluyor olabilir?

Şey… gerçek şu ki SQL o kadar iyi değildi. Biraz dikkat ederseniz INNER JOIN’de bir ayrıntının eksik olduğunu fark edeceksiniz: ON deyimi.

Oluşturulması gereken SQL daha çok şöyle olmalıdır:

Evet, bu basit ayrıntı temel bir fark yaratıyordu.

Mükemmel, sorun tespit edildi. Bunu nasıl tamir ederiz?

Her zamanki gibi, kaynaklara geri dönmekle ilgili. Doctrine belgeleri bu konuda oldukça açık.

Şöyle bir şey yapabilirsiniz:

Ve sonuç doğru olacak, ama bu şekilde bırakırsak fazladan iş yapıyoruz… ve madem bir ORM’imiz var, neden yapıyoruz?

Transaction  sınıfının diğer adı ve nesne-ilişkisel eşlemenin bir parçası olarak tanımlanan ilişki ile, daha iyi bir sürüm şudur:

Sonuç olarak SQL ve DQL benzer ama çok değil. Farklılıkları bilmek ve her fırsatta her birinin en iyisini kullanmak öder.

Yorum yap