doctrine - tipos - tablas polimorficas laravel
Asociaciones polimórficas en la doctrina 2? (2)
Esto no es posible porque una interfaz no puede definir propiedades en una clase, por lo que no puedes garantizar que Doctrine tenga propiedades para manipular.
Si pudiera proporcionar más detalles sobre sus entidades, podría ayudarlo mejor.
Necesito una muestra concreta de código con la doctrina 2 que usa "asociaciones polimórficas". Déjame aclararme a mí mismo. Tengo una Entidad llamada Contrato y un contrato puede tener muchas reglas de precios y estas reglas de precios pueden ser de un tipo diferente de clases y pueden presentarse en diferentes tablas. Supongo que esto es lo que son las asociaciones polimórficas o estoy equivocado?
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
}
}
Puede haber nuevos tipos de reglas de precios en el futuro, entonces, ¿cómo puedo asociar estas reglas a la entidad principal y presistirlas en tablas separadas?
Actualizar:
Este es mi nuevo código:
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();
Pero cuando trato de agregar una nueva regla al contrato recibo un mensaje de error (Error fatal: excepción no detectada ''Doctrine / ORM / Mapping / MappingException'' con el mensaje ''Class Doctrine / Common / Collections / ArrayCollection no es una entidad válida ni una superclase mapeada .)
Qué estoy haciendo mal ?
Es posible que te falte una @MappedSuperclass en tu objeto principal PriceRule
Consulte: Asignación de herencia