Условные отношения в Symfony2

Допустим, у меня есть сущность Post и сущность Comment. Комментарий может быть одобрен или не одобрен администратором (это флаг в БД). Почтовый объект имеет:

/**
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post")
*/
protected $comments;

И я также хочу второй атрибут, который будет выглядеть так:

/**
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post")
*/
protected $approvedComments;

Как можно загрузить здесь только одобренные комментарии?

5

Решение

Вы могли бы использовать Inheritance mapping: http://doctrine-orm.readthedocs.org/en/latest/reference/inheritance-mapping.html

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

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

Тогда у вас будет:

/**
* @ORM\OneToMany(targetEntity="ApprovedComment", mappedBy="post")
*/
protected $approvedComments;

/**
* @ORM\OneToMany(targetEntity="NonApprovedComment", mappedBy="post")
*/
protected $nonApprovedComments;

Очевидным недостатком является создание дополнительных классов.

Вы могли бы просто настроить вас Query/QueryBuilder лайк:

`SELECT p, c FROM AcmeDemoBundle:Post p LEFT JOIN p.comments c WITH c.approved = FALSE`

Эта идея кажется более разумной.

1

Другие решения

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

У вас есть хотя бы решения здесь

  1. Оставьте поле «комментарии» для объекта с аннотациями, удалите аннотации из утвержденного поля комментариев, так как оно совпадает с комментариями, как они понимаются в ORM. Затем у вас будет функция -> getComments (), чтобы получить все комментарии, и вы можете добавить функцию «getApprovedCommentsForPost ($ post)» в свой класс репозитория, чтобы получить эти одобренные.
  2. Вы можете различать комментарии с одним наследованием, поэтому у вас будет класс Comment и класс ApprovedComment, например, в одной таблице, а затем вы можете установить 2 отношения к вашей сущности (см. Здесь doctrine-orm.readthedocs.org/en/latest/ ссылка / наследования mapping.html # одной таблицы наследования)
  3. Вы можете использовать фильтры доктрин для фильтрации неутвержденных комментариев по умолчанию при извлечении данных из хранилища комментариев.
1

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

http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-onetomany

Как видите, нет опции, которая связана с условиями. Вы должны определить это условие с помощью QueryBuilder.

0
По вопросам рекламы [email protected]