Polymorphe Verbände in Lehre 2?
-
27-09-2019 - |
Frage
Ich brauche ein konkretes Beispiel des Codes mit Lehre 2, die „polymorphe Assoziationen“ verwendet. Lassen Sie mich klarstellen. Ich habe eine Entität namens Vertrag und ein Vertrag viele Preisregeln hat und diese Preisregeln können in verschiedenen Tabellen andere Art von Klassen und presisted sein. Ich nehme an, das ist es, was für polymorphe Verbände ist oder bin ich falsch?
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 neue Arten von Preisregeln in der Zukunft sein, so wie kann ich diese Regeln an der Haupteinheit verbinden und presist sie in separaten Tabellen?
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 der Meldung ‚Klasse Lehre \ Common \ Collections \ Arraycollection ist keine gültige Einheit oder Superklasse zugeordnet.)
Was mache ich falsch?
Lösung
Sie können eine @ MappedSuperclass auf Ihrem PriceRule geordnete Objekt
fehltSiehe auch: Inheritance Mapping
Andere Tipps
Ich glaube nicht, das ist möglich, weil keine Schnittstelle Eigenschaften in einer Klasse definieren kann, so dass Sie nicht garantieren können, wird es Eigenschaften für Lehre sein zu manipulieren.
Wenn Sie weitere Informationen über Ihre Einheiten bieten könnten, ich könnte besser helfen.