2015-04-11 6 views
0

У меня есть 3 разных класса (A, B, C), которые связаны с классом D (с некоторыми полями). Поскольку класс D никогда не обновляется, но я создаю обновленную версию его каждый раз, когда он сохраняется, я хочу, чтобы D ссылался на A, но не наоборот.Symfony2 много к одному отношение от разных сущностей: родитель расширенного класса также сохраняется

Пока все хорошо.

Дело в том, что я хочу иметь, что многие к одному отношения от D до А, но другой записи D может относиться к B или C.

Я думал о создании базового класса D, со всеми общий поля, которые мне нужны, и затем создавать классы Da, Db и Dc, расширяющие D, и единственным дополнительным полем Da, Db и Dc было бы много-одно отношение к A, B или C соответственно.

Я предполагаю, что это создаст 3 таблицы: Da, Db и Dc, каждая с соответствующими внешними ключами для A, B, C. Справа?

Любой другой способ решить эту проблему?

EDIT: Мой D класс выглядит следующим образом:

<?php 
// src/AppBundle/Entity/Tolerance.php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** @@ORM\MappedSuperclass */ 
class Tolerance 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $risk; 
    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $scope; 
    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $budget; 
    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $schedule; 
    /** 
    * @ORM\Column(type="integer") 
    */ 
    protected $benefit; 

    /** 
    * @ORM\Column(type="datetime") 
    */ 
    protected $timestamp; 

    /** 
    * @ORM\ManyToOne(targetEntity="User") 
    */  
    protected $changedBy;  


    public function __construct() 
    { 
     $this->timestamp = new \DateTime(); 
    } 

// getters and setters follow 
} 

И мой класс Da является:

<?php 
// src/AppBundle/Entity/StageTolerance.php 

namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use AppBundle\Entity\Tolerance as BaseTolerance; 

/** 
* @ORM\Entity(repositoryClass="AppBundle\Entity\StageToleranceRepository") 
* @ORM\Table(name="stage_tolerances") 
*/ 
class StageTolerance extends BaseTolerance 
{ 

    /** 
    * @ORM\ManyToOne(targetEntity="Stage") 
    */  
    protected $stage; 

    // getters and setters follow 
} 

Это правильный способ решить проблему?

Спасибо!

+0

Могут ли классы A B и C объединяться в единый объект с выбором типа? Или нужно использовать их как объект с разными отношениями с другими объектами? Я думаю, если вы не можете это объединить, вы поступаете правильно. – maches

+0

Они могут быть одним классом с выбором типа, но тогда мне нужна ссылка на правого «отца». Я мог бы, конечно, иметь от 3 до многих отношений, 2 из них нуль, а другой - правого отца (идентифицируется полем «тип»), но я не знаю, является ли он достойным или более удобным для обслуживания ... –

+0

Не создавайте 3, просто создайте его. Толерантность <- OneToMany -> EntityTolerance (с типом) -> ManyToMany -> (self in $ father). Когда вы создаете отца, вам нужно просто проверить правильный тип или установить его вручную. – maches

ответ

0

Ваше решение хорошее. Однако вы можете выбрать тип наследования. Существует обычный тип (ваш), одиночная таблица и наследование таблицы классов. Выберите один из этих типов, который соответствует вашим потребностям. Прочтите doc для получения дополнительной информации.