2013-12-24 6 views
0

У меня возникли проблемы с отображением этих отношений в Доктрине. У меня есть UseCase, у которого есть много UseCaseSteps. У UseCaseStep есть много подэтапов, которые являются OneToMany на UseCaseStep. Вот подходящий код у меня есть атм:Как мне сопоставить эти отношения?

/** 
* UseCase 
* 
* @ORM\Table(name="use_cases") 
* @ORM\Entity(repositoryClass="DesignCase\Bundle\Bundle\Entity\UseCaseRepository") 
*/ 
class UseCase 
{ 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\ManyToMany(targetEntity="Actor", inversedBy="use_cases", cascade={"persist", "remove"}) 
    * @ORM\JoinTable(name="actors_use_cases") 
    */ 
    private $actors; 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="UseCaseStep", mappedBy="useCase", cascade={"persist", "remove"}) 
    * @ORM\OrderBy({"order" = "ASC"}) 
    */ 
    private $steps; 

} 

/** 
* UseCaseStep 
* 
* @ORM\Table(name="use_case_steps") 
* @ORM\Entity(repositoryClass="DesignCase\Bundle\Bundle\Entity\UseCaseStepRepository") 
*/ 
class UseCaseStep 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\ManyToOne(targetEntity="UseCase") 
    */ 
    private $useCase; 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\OneToMany(targetEntity="UseCaseStep", mappedBy="parent", cascade={"persist", "remove"}) 
    * @ORM\OrderBy({"order" = "ASC"}) 
    */ 
    private $subSteps; 

    /** 
    * @var UseCase 
    * 
    * @ORM\ManyToOne(targetEntity="UseCase") 
    */ 
    private $useCaseReference; 

    /** 
    * @var UseCaseStep 
    * 
    * @ORM\ManyToOne(targetEntity="UseCaseStep") 
    * @ORM\JoinColumn(nullable=true) 
    */ 
    private $parent; 

    /** 
    * @var ArrayCollection 
    * 
    * @ORM\ManyToMany(targetEntity="BusinessRule", cascade={"persist", "remove"}) 
    */ 
    private $businessRules; 

} 

Этот код не является полным, но я думаю, что он имеет всю необходимую информацию. Я хочу создать новый объект TestCase, который имеет много TestCaseStep. TestCase - это UseCase с немного дополнительной информацией ... то же самое для TestCaseStep и UseCaseStep. IE, TestCaseStep - это UseCaseStep с добавлением данных и ожидаемыми выходными полями. Пользователь может создавать множество TestCases из одного UseCase.

Я попытался использовать UseCase и UseCaseStep @MappedSuperclass, но это не имеет желаемого эффекта. Я получаю очевидное: «Неправильно устанавливать обратную сторону« одна ко многим »или« многие ко многим »при сопоставлении суперкласса». Кроме того, из документов я не думаю, что это правильный подход.

У меня возникли проблемы с обволакиванием моего мозга вокруг него. Есть предположения? Надеюсь, я объяснил это достаточно хорошо ...

ответ

0

У вас есть проблема, которая намного более фундаментальна, чем Доктрина. Вы хотите показать наследование в базе данных. Для такого подхода нет реального правильного решения. Вы можете пойти с Entity TestCase, который расширяет UseCase и перезаписывает соответствующие свойства (необходимо сделать их защищенными) с другим отношением к TestCaseStep.

Вы делаете что-то подобное с UseCaseStep и TestCaseStep. Таким образом, у вас есть наследование в сущности. Теперь вам нужно будет убедиться, что вы используете другую таблицу, и в итоге вы получаете полностью отдельные сущности, основанные на базе данных. Они просто используют одни и те же свойства в сущности, но отдельно в базе данных.

Этот подход был бы, по моему мнению, самым легким для подражания. Все остальное кажется очень сложным, поскольку вы не можете правильно использовать одну таблицу с различным количеством свойств для каждого объекта. Каждая таблица базы данных имеет фиксированный набор свойств, которые необходимо отразить в сущности.

Другим подходом было бы, конечно, просто использовать свойства в субистеме, которые используются этим сущностью, и создать другое отношение (много-к-одному) между TestCase и UseCase или TestCaseStep и UseCaseStep соответственно. Но последний подход не очень прост и может оказаться очень сложным, если у вас нет большого количества знаний о Doctrine, Symfony и базах данных в целом.

+0

Спасибо, хорошо продуманный ответ. Я пошел с последним подходом. Как вы сказали, это сложно, но это хорошо работает. –

Смежные вопросы