Допустим, у меня есть сущность Post и сущность Comment. Комментарий может быть одобрен или не одобрен администратором (это флаг в БД). Почтовый объект имеет:
/**
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post")
*/
protected $comments;
И я также хочу второй атрибут, который будет выглядеть так:
/**
* @ORM\OneToMany(targetEntity="Comment", mappedBy="post")
*/
protected $approvedComments;
Как можно загрузить здесь только одобренные комментарии?
Вы могли бы использовать 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`
Эта идея кажется более разумной.
Это не может быть достигнуто через отношения, как вы описываете. 2 таблицы не могут быть связаны «условно», так как отношения основаны на первичных ключах.
У вас есть хотя бы решения здесь
Вы не можете определить это противоречие в вашей организации. Вот соответствующая документация:
http://doctrine-orm.readthedocs.org/en/latest/reference/annotations-reference.html#annref-onetomany
Как видите, нет опции, которая связана с условиями. Вы должны определить это условие с помощью QueryBuilder.