gpt4 book ai didi

php - Doctrine单表继承查询所有实例

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:44:43 25 4
gpt4 key购买 nike

我正在开发一个通知系统,所以我有一个通知抽象类和子类(forumPostNotification、privateMessageNotification 等)。它们使用单​​表继承存储,因此它们都在一个具有区分字段的表中。

我想一次获得适用于用户的所有通知,而不是必须单独查询每种类型的通知,但是我不确定如何在 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 中。

我将添加一些代码以进行说明:

通知.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
{
//..
}

我希望能够以一种或另一种方式做这样的事情(我知道我不能从 Notification 查询,因为它是一个抽象类。我只是这样写它来传达我想要的喜欢实现):

$notifications = $em->createQuery('
SELECT n
FROM AcmeMainBundle:Notification n
WHERE n.dateDeactivated IS NULL
ORDER BY n.dateCreated ASC
')->getResult();

最佳答案

我们在订单和产品方面创造了类似的情况。因为您可以在一个订单中包含不同类型的产品,所以我们创建了一个父类 Product 并继承了 ex。 SpecialProduct, SalesProduct 等

我们能够定义订单(在您的情况下是用户)和“产品”(在您的情况下是通知)之间的关系,仅此而已。我们通过 $order->getProducts() 获取订单的所有产品。该方法返回给我们一个精心准备的产品列表,这些产品具有特定的类 ex

order->products[SingleProduct, SingleProduct, SingleProduct, SpecialProduct, SalesProduct, SingleProduct]

所以,总而言之。要获得每个用户的所有通知,您只需要做的一件事就是在您的用户和抽象父类之间定义适当的关系。

这很简单,但是...当您只接收来自特定类型的通知时就不太好了。在您的链接中传递的查询并不漂亮。在我看来,您应该创建一个合适的 queryBuilder - 它非常相似。

最后您不能使用 $user->getNotifications(),但您必须直接从存储库获取通知 -

$em->get('AcmeBundle:User')->getForumPostNotifications()  

亲切的问候,彼得·帕西奇

关于php - Doctrine单表继承查询所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20987871/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com