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?

War es hilfreich?

Lösung

Sie können eine @ MappedSuperclass auf Ihrem PriceRule geordnete Objekt

fehlt

Siehe 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top