Я работаю над системой уведомлений, поэтому у меня есть абстрактный класс и подклассы уведомлений (forumPostNotification, privateMessageNotification и т. Д.). Они хранятся с использованием Single Table Inheritance, поэтому они все в одной таблице с дискриминационным полем.Doctrine Single Inheritance Query Все экземпляры
Я хотел бы получить все уведомления, которые применяются к пользователю сразу, вместо того, чтобы запрашивать каждый тип уведомления по отдельности, однако я не уверен, как это сделать в DQL/symfony (было бы легко в SQL).
Я считаю, что это: (Doctrine 2: how to write a DQL select statement to search some, but not all the entities in a single table inheritance table) похоже на то, что я хотел бы достичь, но я не уверен, как запросить абстрактный объект. Это также не в каталоге Entity, а в Entity/Notifications/Notification.php.
Я добавлю код для осветления:
Notification.php
/**
* Notification Class
*@ORM\Entity
* @ORM\InheritanceType("SINGLE_TABLE")
* @ORM\DiscriminatorColumn(name="type", type="string")
* @ORM\DiscriminatorMap({
* "notification"="Notification",
* "forumPostNotification"="ForumPostNotification",
* ...
* })
* @ORM\Table(name="notification")
*/
abstract class Notification
{
/**
* @ORM\ManyToOne(targetEntity="Acme\MainBundle\Entity\User", inversedBy="notifications")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
*/
private $user;
//...
}
ForumPostNotification.php
/**
* Forum Post Notification
* @ORM\Entity
*/
class ForumPostNotification extends Notification
{
//..
}
PrivateMessageNotification.php
/**
* Private Message Notification
* @ORM\Entity
*/
class PrivateMessageNotification extends Notification
{
//..
}
Я бы как t o быть способным сделать что-то подобное, так или иначе (я понимаю, что я не могу запрашивать из Notification, так как это абстрактный класс. Я просто написал это так, чтобы передать то, что я хотел бы достичь):
$notifications = $em->createQuery('
SELECT n
FROM AcmeMainBundle:Notification n
WHERE n.dateDeactivated IS NULL
ORDER BY n.dateCreated ASC
')->getResult();
просто изменить свой абстрактный класс просто класс, и вы сможете запросить его без каких-либо проблем. или создать 'class QuerableNotification extends Notification' и запросить это. – gondo