Полиморфные ассоциации в учении 2? - PullRequest
4 голосов
/ 22 ноября 2010

Мне нужен конкретный пример кода с доктриной 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();

Но когда я пытаюсь добавитьНовое правило в договоре. Я получаю сообщение об ошибке (Неустранимая ошибка: необработанное исключение «Doctrine \ ORM \ Mapping \ MappingException» с сообщением «Класс Doctrine \ Common \ Collections \ ArrayCollection не является допустимым объектом или сопоставленным суперклассом.)

Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 22 декабря 2010

Возможно, у вас отсутствует родительский объект PriceRule @MappedSuperclass

См .: Отображение наследования

0 голосов
/ 23 ноября 2010

Нет, это возможно, потому что интерфейс не может определять свойства в классе, поэтому вы не можете гарантировать, что для Doctrine будут свойства, которыми можно манипулировать.

Если бы вы могли предоставить более подробную информацию о ваших сущностяхЯ мог бы помочь лучше.

...