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 ?
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
Merci, je pensais en fait qu'il était formulé automatiquement mais évidemment pas .. – Orhan
http://bit.ly/f2Jaa3 :) –