Давайте будем приступать к практике работы со связями между сущностями в фреймворке Symfony. Давайте посмотрим, что у нас имеется на текущий момент, с чего мы начинаем серию видео уроков.

У нас есть некая сущность Page, эта сущность   описывает некоторую страницу Page,  у которой есть следующие поля:  

+ поле id уникальный номер страницы

+ title заголовок страницы

+ content содержимое этой страницы

+ и последнее поле, поле publish, то есть опубликована эта страница или не опубликована.

В базе данных это выглядит как обычная таблица page c полями page,  title,  content и publish

соответственно. См. видео, чтобы посмотреть, как это выглядит.

Задача на текущий момент - создать еще одну сущность, которая будет называться комментарий и этот комментарий будет относиться к какой-то странице, которую мы будем выбирать.

Сущность «комментария» будет связана с сущностью страницы. Т.е. у каждой страницы будут какие-то определенные комментарии, которые будут к ней относятся.

Посмотрим, как можно создать такую сущность и как можно, соответственно, с этим работать. Проще всего создавать сущность через терминал, пишем команду:

bin/console make:entity

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

Первое, что нас просят указать - это, имя класса для нашей сущности. Пусть эта сущность у нас будет называться comment «комментарий», после жмем enter. Теперь нам нужно указать свойства, которые будет иметь эта сущность. Создадим в ней сначала свойство content - это содержимое комментария, тип этого поля text.

Может ли это поле быть пустым и принимать нулевое значение -  укажем, нет, т.к. комментарий не может быть пустым.

Теперь давайте создадим такое свойство, в этой сущности которое, собственно говоря, и будет являться связью. Назовем эту это поле Page. Т.е. у комментария будет некое поле, которое будет содержать в себе объект страницы, которая соответствует этому комментарию.

Так же укажите поле relations то есть, связь на какой класс этой сущности мы будем ссылаться.

В данном случае мы ссылаемся на класс сущности Page, и теперь нам предлагается следующий вопрос.

Какой вид связи вы хотите использовать?

Здесь показаны подсказки какие виды связи у нас.

ManyToOne 

OneToMany 

ManyToMany

OneToOne

В нашем случае подходит ManyToOne

Выбираем его и жмем enter.

Может ли это наше связующее поле принимать нулевое значение - пишем нет, потому что комментарии без страницы, к которой он относится существовать не может, поэтому мы указываем здесь нет.

Теперь, важный момент, нас спрашивают, хотели бы мы сделать обратную связь в

таблице page сущности page чтобы из страницы мы с вами могли получать методом getComments все комментарии, которые относятся к этой странице, то есть это обратная связь из сущности страницы в сущность комментария, чтобы из сущностей странице мы получали все комментарии, которые к ней относится, это бывает очень удобной и в, нашем случае это просто жизненно необходимо, потому что получать комментарии из какой-то сущности странице это будет значительно экономить на время web-разработки, поэтому ставим здесь  «да», чтобы была создана такая обратная связь.

Этот шаг является опциональным, если вам не нужна такая обратная связь, вы можете поставить здесь «нет».

Как будет называться поле внутри сущности Page. Пусть будет поле по умолчанию comments. В

Принципе, нас это устраивает, жмем enter.

Последний вопрос, хотели бы ли вы чтобы Symfony автоматически удалял страницы, у которых нет комментариев?

Для нас такой вариант не подходит, пишем «нет», потому что у нас вполне могут

существовать страницы у которых нет комментариев, такая ситуация вполне может

быть поэтому удалять нам ничего не нужно пишем, нет и жмем enter.

Наша сущность создана. Жмем ctrl+c чтобы выйти.

Сворачиваем терминал и смотрим что у нас произошло.

Как вы видите, у нас была создана новая сущность Comment «комментарий».

Имеется: уникальный идентификатор ID этого комментария, поле Content содержимое комментария и соответственно это наше поле, ради которого мы и создавали эту сущность - поле page.

Обратите внимание, что тип этого поля стоит уже не как колонка, а как тип связи ManyToOne. Т.е. множеству комментариев соответствует одна страница, целевая к сущность этой page.

InversedBy -  это то, как называется поле внутри нашей сущности Page. Это поле было создано автоматически, с нашей сущности Page, которая теперь называется comments «комментарии», в множественном числе и она ссылается обратно на нашу сущность Comment.

Это является опциональной возможностью.

Обратите внимание, что в сущности Page, связь OneToMany, а в сущности Comment - ManyToOne.

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

Ну вот, собственно говоря, и все. Обратите внимание, что у нас появилась здесь такая конструкция:

$this ->comments = ArrayCollection();

В этом объекте хранится некий массив, о котором мы поговорим позже, как с ним работать.

По сути - это такое виртуальное поле, которое у нас не создает никаких записей в базе данных.

Посмотрим, что у нас происходит сейчас базе данных, какие поля после этого были созданы, для этого мы сейчас выполним миграцию базы данных.

Создадим и выполним эту миграцию

bin/console doctrine:migrstions:migrate

в нашей базе данных теперь должны произойти изменения, которые были вызваны созданием  сущности комментариев, давайте посмотрим какие поля и какие таблицы у нас появились.

Я перехожу в базу данных Symfony.  У нас появилась новая табличка Comment (комментарий). Пока эта табличка у нас пустая и, как вы видите, она содержит у нас поля

id

page_id

content

page_id

Это то поле, которое будет ссылаться на нашу страницу Page. Т.е на этот идентификатор нужной сущности.

Cодержимое страницы таблицы Page у нас никак не поменялось.

В следующих видео мы уже попробуем с вами создавать экземпляры комментариев и

попытаемся присоединить их к нашей странице Page.

На этом заканчиваем. Потренируйтесь создать подобные сущности у себя, чтобы у нас

было примерно одинаковая структура данных и будем уже переходить практике. Посмотрим, как в реальности создавать конкретные экземпляры, которые будут содержать такие связи.