Tahrik Tek tablo devralma Sayı

2 Cevap php

Ben "talk" adında bir tablo, benim schema.xml dosyasında soyut olarak tanımlanır hangi.

Yorum, Değerlendirme, İnceleme, Terrible: Bu 4 nesneleri (ClassKey başına 1) oluşturur

Ayrıca TalkPeer üretir, ama diğer 4 eş (CommentPeer, RatingPeer, ReviewPeer, CheckinPeer) üretmek için alamadım, bu yüzden onları eliyle yaratılmış ve onları BaseTalkPeer devraldığı TalkPeer.php, devralan yaptı. Ben daha sonra bu eş her getOMClass () uygulanmaktadır.

Ben 4 eş kullanarak sorgular yaptığınızda, onlar nesnelerin her 4 türleri dönmek The problem is söyledi. Yani, ReviewPeer Ziyaretler, değerlendirme, yorum ve eleştiri dönecektir.

Example:

$c = new Criteria();
$c->add(RatingPeer::VALUE, 5, Criteria::GREATER_THAN);
$positive_ratings = RatingPeer::doSelect($c);

Bu tüm yorumlar, değerlendirme, yorum döndürür & > 5 bir değere sahip checkins.

ReviewPeer should only return Review objects, and can't figure out how to do this.

Do I actually have to go through and change all my criteria to manually specify the classkey? That seems a little pointless, since the Peer name already distinct. I don't want to have to customize each Peer. I should be able to customize JUST the TalkPeer, since they all inherit from it... I just can't figure out how.

Ben otomatik Kriterlerine ClassKey kısıtlama ekler, böylece sadece TalkPeer içinde doSelectStmt değiştirmeyi denedim. Neredeyse çalışır, ama olsun: Ölümcül hata:. Hattında 503 Hattı 503) (BaseTalkPeer :: populateObjects olduğunu ve aşağıda 3. çizgi içinde / modelleri / om / BaseTalkPeer.php soyut sınıf konuşun örneğini değil miyim:

$cls = TalkPeer::getOMClass($row, 0); 
$cls = substr('.'.$cls, strrpos('.'.$cls, '.') + 1); 
$obj = new $cls();

docs talked about overriding BaseTalkPeer::populateObject(). I have a feeling that's my problem, hatta kaynak kodu okuduktan sonra, ben hala işe almak için nasıl çözemedim.

İşte TalkPeer :: doSelectStmt denedim budur:

    public static function doSelectStmt(Criteria $criteria, PropelPDO $con = null)
    {
        $keys = array('models.Visit'=>1,'models.Comment'=>2,'models.Rating'=>3,'models.Review'=>4);

        $class_name = self::getOMClass();

        if(isset($keys[$class_name]))
        {   //Talk itself is not a returnable type, so we must check
            $class_key = $keys[$class_name];
            $criteria->add(TalkPeer::CLASS_KEY, $class_key);
        }

        return parent::doSelectStmt($criteria, $con = null);
    }

Burada ReviewPeer benim getOMClass yöntemin bir örneği aşağıda verilmektedir:

public static function getOMClass()
{
    return self::CLASSNAME_4; //aka 'talk.Review';
}

İşte benim şema ilgili biraz:

<table name="talk" idMethod="native" abstract="true">
   <column name="talk_pk" type="INTEGER" required="true" autoIncrement="true" primaryKey="true" />
   <column name="class_key" type="INTEGER" required="true" default="" inheritance="single">
       <inheritance key="1" class="Visit" extends="models.Talk" />
       <inheritance key="2" class="Comment" extends="models.Talk" />
       <inheritance key="3" class="Rating" extends="models.Talk" />
       <inheritance key="4" class="Review" extends="models.Rating" />
       </column>
</table>

P.S. - No, I can't upgrade from 1.3 to 1.4. There's just too much code that would need to be re-tested

2 Cevap

Tüm Peers oluşturmak böylece Neden sadece like it tam olarak db almak için tekrar oluşturmak, tekrar soyut ekleyin, sonra soyut = true ifadeleri kaldırmak değil mi?

Ive uskur devralma hiç kullanmadım ama kriterleri değiştirebilir ve miras anahtar için ekstra koşulunu belirtmek için her Peer sınıf doSelectRS yöntemlerini değiştirmek gerekir. Ben önümde dokümanlar yok ama sahte kodda ITD şuna benzer:

public static function doSelectRS(Criteria $c)
{
   // you may want to check if the condition already exists in one of the criterion's before doing the following...
   $c->add(RatingPeer::TYPE, 3);
   return parent::doSelectRS($c);
}