associations polymorphes dans la doctrine 2?
-
27-09-2019 - |
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?
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.