Doctrine 2中的多态关联?

4
我需要一个使用Doctrine 2的“多态关联”的具体代码示例。 让我澄清一下。我有一个实体称为Contract,一个合同可以有多个价格规则,这些价格规则可以是不同类型的类并且存在于不同的表中。我想这就是多态关联的用途,或者我错了吗?
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
    }
}

未来可能会有新的价格规则类型,那么我该如何将这些规则与主实体关联并将它们存储在单独的表中?

更新:

这是我的新代码:

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();

但是当我尝试向合同添加新规则时,我收到错误消息(致命错误:未捕获的异常'Doctrine\ORM\Mapping\MappingException',消息为“类Doctrine\Common\Collections\ArrayCollection不是有效实体或映射超类。”)

我做错了什么?


嘿,伙计,我不知道doctrine[2],但我知道其他人可能会因为你未能正确格式化你的问题而指责你。如果你在帖子下方点击“编辑”,突出显示帖子中的所有代码并单击编辑器上方的“101 010”按钮,人们可能会更快地回复。 - Chris Pfohl
谢谢,我原以为它是自动格式化的,但显然不是。 - Orhan Saglam
2个回答

5
您的PriceRule父对象可能缺少@MappedSuperclass注释。
请参考:继承映射

0

我认为这是不可能的,因为一个接口不能在一个类中定义属性,所以你不能保证Doctrine有属性可以操作。

如果您能提供更多关于实体的细节,我可以提供更好的帮助。


1
首先,我认为您需要将priceRule中的属性设置为protected,以便子类可以访问它们。其次,我不认为需要在子类中重新定义$id。 此外,您应该使用ArrayCollection类的add()和remove()方法。您能给我提供完整的错误信息吗? - Cobby

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接