SORU
19 NİSAN 2011, Salı


Doktrini 2 Dernek ile Eşleştirme Miras

Mümkün değil istediğim, "mümkün değil" cevabını kabul edilecektir . NOT :

Doctrine 2 documentation about inheritance mapping 2 yolu vardır diyor

  • Tek tablo devralma (STI)
  • Sınıf tablo devralma (CTI)

Her ikisi için de, uyarı vardır :

Eğer çok-bir veya bire-bir varlık . ŞTİ/CTI bir varlık kullanırsanız ^strong>hiçbir zaman üst seviyelerde sınıfları kullanındevralma hiyerarşisinde “targetEntity”, alt sınıflar bu sadece. Aksi halde Doktrin bu varlığın proxy örnekleri oluşturmak ve her ZAMAN varlık hevesle yükleyecektir.

Nasıl devam edebilirim yani(Özet) temel sınıf için bir dernek ile devralma kullanmak için? (ve tabii ki performansını devam)


Örnek

Bir kullanıcı birçok vardır Pet (soyut sınıf Dog Cat genişletilmiş).

Ne istiyorum :

class User {
    /**
     * @var array(Pet) (array of Dog or Cat)
     */
    private $pets;
}

Doktrin belgelerinde uyarı nedeniyle, yapmam gereken :

class User {
    /**
     * @var array(Dog)
     */
    private $dogs;
    /**
     * @var array(Cat)
     */
    private $cats;
}

Bu miras faydaları gevşek çünkü sinir bozucu !

Not : eşleme DB için Doktrin ek açıklamalar eklemek istemedim, ama ne demek istediğimi anlayabilirsiniz

CEVAP
18 AĞUSTOS 2011, PERŞEMBE


Yorgunum, ama bu hiçbir şey hakkında much ado gibi görünüyor.

Bu uyarı önemli kısmı kaçırdın:

Eğer hala CTI bir varlık kullanırsanızçok-bir veya bire-bir varlık olarak

Bu örnekte durum böyle değil! Eğer Doktrini ek açıklamalar atlanmış olsaydı, fark etmiş olabilirsiniz.

Dernek Kullanıcı::Evcil Hayvanlar, [Bir Çok]) OneToMany değil. Bir kullanıcı çok sayıda hayvan vardır.

Ters DerneğiOneToOne, ama herhangi bir miras olan Kullanıcı, hedef alıyor.

Robin cevabı iyi bir ipucu sql sorguları oturum ve doktrin aslında ne veritabanınıza görebilirsiniz -- olmalıydı!


Kötü performans senaryosu gibi bir şey:

abstract class Pet { ... }

class Cat extends Pet { ... } 

class Dog extends Pet { ... }

class Collar {
   /**
    * @Column(length="16")
    */

   protected $color;
   /**
    * ManyToOne(targetEntity="Pet")
    */
   protected $owner;
}

Eğer tüm mavi yaka üzerinde yineleme istersen şimdi, Doktrin biraz sıkıntı içine çalışır. Sınıf sahibi $olacak, bir Proxy kullanın, böylece ne olduğunu bilmiyorlar. Bunun yerine, bir Kedi veya bir Köpek olup olmadığını öğrenmek için zorla hevesle yük $sahibi.

Bu OneToMany veya ManyToMany ilişkiler için bir sorun değil, bu durumda, tembel yükleme gayet iyi çalışıyor çünkü. Bir proxy yerine, bir PersistentCollection. Ve bir PersistentCollection her zaman sadece bir PersistentCollection. Aslında onlara sormadan kendi içeriği hakkında hiçbir şey umurunda değil. Tembel yükleme gayet iyi çalışıyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • sinumatic

    sinumatic

    19 Aralık 2006
  • Troy Hunt

    Troy Hunt

    29 EYLÜL 2011
  • warningthepeople

    warningthepe

    21 EYLÜL 2011