У меня есть 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
}
Это правильный способ решить проблему?
Спасибо!
Могут ли классы A B и C объединяться в единый объект с выбором типа? Или нужно использовать их как объект с разными отношениями с другими объектами? Я думаю, если вы не можете это объединить, вы поступаете правильно. – maches
Они могут быть одним классом с выбором типа, но тогда мне нужна ссылка на правого «отца». Я мог бы, конечно, иметь от 3 до многих отношений, 2 из них нуль, а другой - правого отца (идентифицируется полем «тип»), но я не знаю, является ли он достойным или более удобным для обслуживания ... –
Не создавайте 3, просто создайте его. Толерантность <- OneToMany -> EntityTolerance (с типом) -> ManyToMany -> (self in $ father). Когда вы создаете отца, вам нужно просто проверить правильный тип или установить его вручную. – maches