4

Ich brauche eine konkrete Beispielcode mit Lehre 2, die "polymorphe Assoziationen" verwendet. Lassen Sie mich mich selbst klären. Ich habe eine Entität namens Vertrag und ein Vertrag kann viele Preisregeln haben und diese Preisregeln können verschiedene Arten von Klassen sein und in verschiedenen Tabellen vorliegen. Ich nehme an, dass das polymorphe Assoziationen sind oder liege ich falsch?Polymorphe Assoziationen in der Lehre 2?

class contract { 

    private $id; 

    private $priceRules; 


} 

class discountRule implements priceRule{ 

    function calculate() { 
     // calculate new price after this rule 
    } 
} 

class extraSpecialRule implements priceRule { 

    function calculate() { 
     // calculate new price after this rule 
    } 
} 

Es kann in Zukunft neue Arten von Preisregeln sein, so wie kann ich diese Regeln an der Haupteinheit verbinden und sie in separaten Tabellen presist?

Update:

Das ist mein neuer Code:

contract.php

namespace Entities; 

use Doctrine\Common\Collections\ArrayCollection; 


/** 
* @Entity @Table(name="contract") 
*/ 
class Contract { 

    /** 
    * 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * 
    * @Column(type="integer") 
    */ 
    private $propertyId; 

    /** 
    * 
    * @Column(type="integer") 
    */ 
    private $agencyId; 

    /** 
    * 
    * @OneToMany(targetEntity="priceRule" ,mappedBy="contract") 
    * 
    */ 
    private $priceRules; 

    public function __construct($propertyId,$agencyId){ 
     $this->propertyId=$propertyId; 
     $this->agencyId=$agencyId; 
     $this->priceRules=new ArrayCollection(); 
    } 

    public function addPriceRule(priceRule $rule){ 
     $this->priceRules[]=$rule; 
    } 

    public function getPriceRules(){ 
     return $this->priceRules; 
    } 
} 

pricerule.php

namespace Entities; 

/** 
* @Entity 
* @InheritanceType("JOINED") 
* @DiscriminatorColumn(name="discr" , type="string") 
* @DiscriminatorMap({"discountrule"="discountRule","extradiscountrule"="extraDiscountRule"}) 
*/ 
class priceRule{ 
    /** 
    * 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
     * 
     * @ManyToOne(targetEntity="contract",inversedBy="availibilityRules") 
     * @JoinColumn("contract_id",referencedColumnName="id") 
     */ 
    private $contract; 

} 

discountrule.php

namespace Entities; 

/** 
* @Entity 
* 
* 
*/ 
class discountRule extends priceRule { 

    /** 
    * 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    public function calculatePrice(){ 
     // calculate new price 
    } 

} 

extradiscountrule.php

namespace Entities; 

/** 
* @Entity 
* 
* 
*/ 
class extraDiscountRule extends priceRule { 

    /** 
    * 
    * @Id @Column(type="integer") 
    * @GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 


     public function calculate() { 
      // calculate new price 
     } 

} 

sampleusage.php

$contract=new Contract(1,1); 
$discount=new discountRule(); 

$em->persist($discount); 

$contract->addPriceRule($discount); 

$em->persist($contract->getPriceRules()); 
$em->persist($contract); 

$em->flush(); 

Aber wenn ich versuche, neue Regel für den Auftrag hinzufügen I Fehlermeldung (Fatal Fehler: abgefangene Ausnahme ‚Lehre \ ORM \ Mapping \ MappingException 'mit Nachricht' Class Doctrine \ Common \ Collections \ ArrayCollection ist keine gültige Entity oder zugeordnete Superklasse.)

Was mache ich? falsch ?

+0

Hey Mann, ich weiß Lehre nicht [2], aber ich weiß, dass andere Leute auf Sie springen könnten weil Sie Ihre Frage nicht richtig formatiert haben. Wenn Sie direkt unter Ihrem Beitrag auf "Bearbeiten" klicken, markieren Sie den gesamten Code in Ihrem Beitrag und klicken Sie auf die Schaltfläche "101 010" über dem Editor, die Leute reagieren wahrscheinlich schneller. – Crisfole

+0

Danke, ich dachte eigentlich, dass es automatisch formatiert wurde, aber offensichtlich nicht .. – Orhan

+0

http://bit.ly/f2Jaa3 :) –

Antwort

5

Sie können

Siehe eine @ MappedSuperclass auf Ihrem PriceRule geordnete Objekt fehlt: Inheritance Mapping

0

Dies ist nicht möglich, da eine Schnittstelle keine Eigenschaften in einer Klasse definieren kann, so dass Sie nicht garantieren können, dass es Eigenschaften gibt, die Doctrine manipulieren kann.

Wenn Sie mehr Details zu Ihren Entitäten bereitstellen könnten, könnte ich Ihnen besser helfen.

+0

Danke, ich habe den Code mit Vererbung aktualisiert und nicht mit Schnittstelle .. – Orhan

+1

Erstens, Ich denke, Sie müssen die Eigenschaften in priceRule auf protected setzen, damit die Unterklassen auf sie zugreifen können. Zweitens glaube ich nicht, dass die $ id auf den Unterklassen neu definiert werden muss. Sie sollten auch die Methoden add() und remove() der ArrayCollection-Klasse verwenden. Können Sie mir den vollen Fehler geben, den Sie bekommen? – Cobby