2014-10-25 6 views
2

Я пытаюсь разобраться с отношениями ORM доктрины 2, я думал, что у меня есть это, но после прочтения нескольких записей в кулинарной книге symfony я подозреваю, что я на самом деле немного путать.От многих до многих, от одного до многих или от многих до одного

В настоящее время у меня есть система, в которой шаблон может содержать несколько модулей (включая более одного типа), а несколько шаблонов могут использовать один и тот же модуль.

Я думал, что это оправдывает отношения ManyToMany и действительно смотрит на мой стол, кажется, что он работает неплохо.

Однако я понял, что при написании запроса базы данных мне нужны модули для загрузки в определенном порядке, что означает, что моя таблица соединений должна иметь третий столбец «order_by». Я прочитал, что в реальной таблице соединений есть только два столбца.

Отсюда путаница. Что мне следует задать, как в моих сущностях?

ответ

2

Как @Kris сказал - вы отправитесь от одного к многим к среднему сущности. Если вы перейдете для многих к многим, то у вас не будет файла класса для средней таблицы, что в большинстве случаев является проблемой.

M-N предположение: ОДИН Студенческие исследования в МНОГИХ Курсах и ОДНОМ КУРСЕ могут иметь МНОГО студентов.

Оба приведенных ниже примера дают вам эту ERD в базе данных, но вы хотите перейти к ОДНОЙ в МНОГО версию.

enter image description here

многие ко многим:

Это создаст StudentCourse объект в базе данных, но, как вы не видите фактический файл класса для вас, чтобы иметь дело с.

class Student 
{ 
    protected $id; 
    protected $name; 

    /** 
    * @ORM\ManyToMany(targetEntity="Course") 
    * @ORM\JoinTable(
    * name="StudentCourse", 
    * joinColumns={@ORM\JoinColumn(name="studentId", referencedColumnName="id")}, 
    * inverseJoinColumns={@ORM\JoinColumn(name="courseId", referencedColumnName="id")} 
    *) 
    */ 
    private $course; 
} 

class Course 
{ 
    protected $id; 
    protected $name; 
} 

один ко многим:

Это создаст StudentCourse объект в базе данных, и, как вы видите, есть фактический файл класса для вас, чтобы иметь дело с при кодировании, например, сохраняются() и т.д.

class Student 
{ 
    protected $id; 
    protected $name; 

    /** 
    * @ORM\OneToMany(targetEntity="StudentCourse", mappedBy="studentMap", 
    * cascade={"persist", "remove"}) 
    */ 
    protected $studentInverse; 
} 

class StudentCourse 
{ 
    protected $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Course", inversedBy="courseInverse") 
    * @ORM\JoinColumn(name="course", referencedColumnName="id", 
    * nullable=false, onDelete="CASCADE") 
    */ 
    protected $courseMap; 

    /** 
    * @ORM\ManyToOne(targetEntity="Student", inversedBy="studentInverse") 
    * @ORM\JoinColumn(name="student", referencedColumnName="id", 
    * nullable=false, onDelete="CASCADE") 
    */ 
    protected $studentMap; 
} 

class Course 
{ 
    protected $id; 
    protected $name; 

    /** 
    * @ORM\OneToMany(targetEntity="StudentCourse", mappedBy="courseMap", 
    * cascade={"persist", "remove"}) 
    */ 
    protected $courseInverse; 
} 

РЕДАКТИРОВАТЬ: onDelete="CASCADE" и cascade={"persist", "remove"} биты не являются обязательными. Они обрабатывают избыточность данных.Is it bad to use redundant relationships?

+0

Wow спасибо, что объяснил это так ясно! Это невероятно полезно. –

+0

Нет проблем. Возможно, вы уже знаете, но я добавил примечание под EDIT. – BentCoder

+0

Хорошо, я внес эти изменения, и сама база данных, похоже, настроена правильно. Однако мои светильники больше не выглядят счастливыми. Когда я пытаюсь загрузить их, я получаю сообщение об ошибке, которое я добавил в нижней части моего вопроса. –

1

Вам понадобится OneToMany/ManyToOne Если вам не нужно было сохранять заказ, это было бы много, но с тех пор, как вы это делаете, эта средняя таблица теперь должна быть его собственной сущностью, к сожалению. Так вам потребуется следующие субъекты

Шаблон

с OneToMany к

TemplateModules (вероятно лучшее название для этого)

С ManyToOne к

модулей

+0

Это имеет смысл. Большое спасибо. –

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