Pregunta

necesito una muestra concreta del código con la doctrina 2 que utiliza "asociaciones polimórficas". Aclaro mi mismo. Tengo una entidad llamada Contrato y un contrato puede tener muchas reglas de precios y estas reglas de precios puede ser diferente tipo de clases y presisted en tablas diferentes. Supongo que esto es lo que hay asociaciones polimórficas para 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
    }
}

No puede haber nuevos tipos de reglas de precios en el futuro, así que ¿cómo puedo asociar estas reglas a la entidad principal y presist en tablas separadas?

Actualización:

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 intento agregar nueva regla para el contrato consigo el mensaje de error (error fatal: Excepción no detectada 'Doctrine \ ORM \ Mapping \ MappingException' con el mensaje 'clase Doctrine \ Common \ Collections \ ArrayCollection no es una entidad válida o mapeado superclase.)

¿Qué estoy haciendo mal?

¿Fue útil?

Solución

Es posible que se echa en falta un @MappedSuperclass en su objeto padre PriceRule

Consulte: Herencia Mapeo

Otros consejos

No me esto es posible porque una interfaz no puede definir las propiedades de una clase, por lo que no puede garantizar que habrá propiedades para la Doctrina de manipular.

Si pudiera dar más detalles sobre sus entidades que podría ayudar mejor.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top