Bunlar genellikle işe beklenen nasıl bir ORM zincirleme erişimcilerden ve ne kadar derin gibi özellikleri gerçekleştirmek için yönetir?
Kimse bu cevap gibi görünüyor. Ben hızlı Doktrin PHP yapar nasıl açıklayabilirsiniz.
Doktrin olarak, bir nesne modeline bakın alanların hiçbiri aslında o sınıf için tanımlanmıştır. Yani örnekte, $ araç-> sahipleri, 'sahiplerinin $ otomobilin sınıfında tanımlanan denilen hiçbir gerçek bir alan vardır.
Bunun yerine, ORM __get and __set gibi sihirli yöntemler kullanır. Eğer $ araba-> rengi gibi bir ifade kullanmak çok zaman, içten PHP Doctrine_Record # __get ('renk') çağırır.
Bu noktada, her durumda gerekli ORM bu karşılamak için serbesttir. Olası tasarımları bir yeri vardır burada. Bu, örneğin $ _values denilen bir dizide bu değerleri depolamak ve daha sonra dönebilirsiniz $ this-> _values ['color']. Özellikle parça değil sadece her kayıt için değerler değil, aynı zamanda veritabanı sebat onun durumu göreceli olarak doktrin.
Sezgisel değil bu bir örneği Doktrini ilişkileri ile. Eğer $ arabaya bir başvuru olsun, 'sahipleri' olarak adlandırılan insanlar tabloya bir ilişki vardır. Yani $ araba> sahipleri için veri aslında $ arabanın kendisi için veriden ayrı bir tabloda saklanır. Yani ORM, iki seçeneğiniz vardır:
- Bir $ kullanıcıyı yüklerken her seferinde, ORM otomatik olarak ilgili tüm tabloları katılır ve nesnenin içine bu bilgileri doldurur. Eğer $ araba-> sahipleri yaptığınızda, bu veriler var zaten. Nesneleri birçok ilişkileri olabilir, ve bu İlişkiler İlişkiler kendilerini olabilir, çünkü bu yöntem, ancak yavaş. Yani a lot of joins ekleyerek olurdu ve mutlaka bile bu bilgiyi kullanarak değil.
- Bir $ kullanıcı yüklemek her zaman, alanlar Kullanıcı tablosundan yüklenen ve onları doldurur olan ORM bildirimler, ancak ilgili tablolardan yüklenen tüm alanları yüklenmez. Bunun yerine, bazı meta olma olarak işaretlemek için bu alanlara bağlı 'yüklü değil, ama mevcut' dir. Eğer ifade $ araç-> sahipleri yazarken şimdi, ORM 'sahiplerinin ilişki yüklenmiş olmadığını görür, ve o, bu bilgi almak nesnesinin içine ekleyin ve sonra bu verileri döndürmek için ayrı bir sorgu verir. Bu, tüm Bunu gerçekleştirmek için gerek kalmadan şeffaf olur.
# 1 orta karmaşıklığı ile herhangi bir gerçek üretim yeri için ağır olur beri Tabii ki, Doktrin, 2. kullanır. Ama aynı zamanda yan etkileri vardır. Eğer $ arabada birkaç ilişkilerini kullanarak iseniz erişmek, sonra Doktrin, her birinin ayrı ayrı yükleyecektir. Böylece belki de sadece 1 gerekli olduğunda 5-6 sorguları çalıştıran sonunda.
Doktrin Eğer Doktrin Query Language kullanarak bu durumu optimize sağlar. Eğer bir araba nesnesi yüklemek istediğiniz DQL anlatmak değil, aynı zamanda vb sahipleri, üreticiler, başlıklar, rehin, onu katılmak ve bu nesnelerin içine tüm veriler yükler.
Yaşasın! Uzun yanıt. Temel olarak, olsa da, kalbinde kazanılmış "bir ORM amacı nedir?" ve "Neden birini kullanmak gerekir?" ORM bize çoğu zaman nesne modunda düşünmeye devam etmesini sağlar, ancak soyutlama mükemmel değildir ve soyutlama sızıntı performans cezalar gibi çıkıp eğilimindedir.