Question

J'ai besoin d'un échantillon de béton de code avec la doctrine 2 qui utilise des « associations polymorphes ». Permettez-moi de me préciser. J'ai une entité appelée contrat et un contrat peut avoir de nombreuses règles de prix et ces règles de prix peuvent être différents types de classes et différentes tables se pratique encore dans. Je suppose que c'est ce qui est des associations polymorphiques pour ou je me trompe?

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
    }
}

Il peut y avoir de nouveaux types de règles de prix à l'avenir, alors comment puis-je associer ces règles à l'entité principale et les presist dans les tableaux séparés?

Mise à jour:

Ceci est mon nouveau 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();

Mais lorsque je tente d'ajouter une nouvelle règle au contrat, je reçois un message d'erreur (erreur fatale: Uncaught exception « Doctrine \ ORM \ Mapping \ MappingException » message « de classe Doctrine \ Common \ Collections ArrayCollection est pas une entité valide ou cartographié super classe.)

Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Vous pouvez manquer un @MappedSuperclass sur votre objet parent PriceRule

Reportez-vous à: Héritage Mapping

Autres conseils

Je ne suis pas cela est possible car une interface ne peut pas définir des propriétés dans une classe, de sorte que vous ne pouvez pas garantir qu'il y aura des propriétés pour Doctrine de manipuler.

Si vous pouviez fournir plus de détails sur vos entités je pourrais aider à mieux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top