4

J'ai besoin d'un échantillon concret de code avec doctrine 2 qui utilise des "associations polymorphes". Permettez-moi de clarifier moi-même. 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 de différentes sortes et sont conservées dans des tables différentes. Je suppose que c'est ce à quoi correspondent les associations polymorphes ou ai-je tort?Associations polymorphes dans la doctrine 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 
    } 
} 

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 des tables séparées?

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 'avec le message' Class Doctrine \ Common \ Collections \ ArrayCollection n'est pas une entité valide ou une super classe mappée.)

Que puis-je faire? faux ?

+0

Hey man, je ne sais pas la doctrine [2], mais je sais que d'autres personnes pourraient sauter sur vous pour ne pas avoir correctement formater votre question. Si vous cliquez sur "modifier" juste sous votre message, mettez en surbrillance tout le code dans votre message et cliquez sur le bouton '101 010' au-dessus de l'éditeur, les gens seront probablement beaucoup plus rapides à répondre. – Crisfole

+0

Merci, je pensais en fait qu'il était formulé automatiquement mais évidemment pas .. – Orhan

+0

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

Répondre

5

Vous pouvez manquer un @MappedSuperclass sur votre objet parent PriceRule

Se reporter à: Inheritance Mapping

0

Cela n'est pas possible car une interface ne peut pas définir les propriétés d'une classe. Vous ne pouvez donc pas garantir que Doctrine aura des propriétés à manipuler.

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

+0

Merci, j'ai mis à jour le code en utilisant l'héritage et ne pas utiliser l'interface .. – Orhan

+1

Premièrement, Je pense que vous devrez définir les propriétés dans priceRule à protéger afin que les sous-classes puissent y accéder. Deuxièmement, je ne pense pas qu'il soit nécessaire de redéfinir le $ id sur les sous-classes. En outre, vous devez utiliser les méthodes add() et remove() de la classe ArrayCollection. Pouvez-vous me donner l'erreur complète que vous obtenez? – Cobby