4

我需要一個使用「多態關聯」的教條2的代碼的具體示例。 讓我澄清一下自己。我有一個實體稱爲合約,合約可以有許多價格規則,這些價格規則可以是不同種類的類別,並在不同的表格中列出。我想這是什麼的多態關聯或我錯了?學說2中的多態關聯?

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

但是,當我嘗試新的規則添加到合同我收到錯誤消息(致命錯誤:未捕獲的異常「學說\ ORM \ Mapping \ MappingException'消息'Class Doctrine \ Common \ Collections \ ArrayCollection不是一個有效的實體或映射的超類。)

我在做什麼錯了?

+0

嗨,老兄,我不知道學說[2],但我不知道其他人可能會在你跳未能正確格式化您的問題。如果您點擊帖子下方的「修改」,突出顯示帖子中的所有代碼,然後點擊編輯器上方的「101 010」按鈕,用戶的回覆可能會快得多。 – Crisfole 2010-11-22 14:46:12

+0

謝謝,我實際上認爲它是自動形成的,但顯然不是.. – Orhan 2010-11-22 14:55:12

回答

0

我不這樣做是可能的,因爲一個接口不能在一個類中定義屬性,所以你不能保證會有屬性來操縱Doctrine。

如果你可以提供你的實體更多的細節,我可以幫助更好。