gpt4 book ai didi

php - 实体中的 Doctrine isDeletable 方法

转载 作者:可可西里 更新时间:2023-11-01 13:22:32 24 4
gpt4 key购买 nike

我的数据库中有一个实体(比如成员),它与其他表有很多关系(准确地说是 6 个关系)。其中一些我不想与 ORM 映射(我的意思是链接到这个实体),因为它们可能有很多记录(例如 MemberAccessLogs),而其他一些加载许多其他实体。

现在我希望这个成员实体有一个 isDeletable 方法,这样我就可以在管理页面中禁用排除按钮。

如果我在哪里以传统方式执行此操作,我将不得不声明与实体类中所有其他表的关联,包括 MemberAccessLogs,我会将方法放入其中,以便我可以测试这些关联是否为空。

但是 AFAIU,我必须对关联表进行提取(或至少计数)以检查是否为空。

另一种方法是获取我想要显示的成员,然后进行单独的查询以检查这些子表中是否存在低成本的空值(select * from table limit 1),然后填充成员中的 isDeletable 方法在将其传递给 Twig 之前以编程方式进行。

但我发现这个解决方案很麻烦。谁有更好的方法来做到这一点?

仅作记录:有些人可能认为这是“过早的优化”。我坚持认为(与某些人相反),您在编程时应该提前考虑,这不是一件坏事。但我真的认为这不是讨论它的地方。请让我们专注于提出的问题好吗? :)

编辑

为了轻松证明 limit 1 比 count 快得多,我在我的数据库中有一个超过 2000 万行的表中做了一个小测试。以下是结果:

select count(*) from loga [20 million+ table]
20678473
1 row(s) fetched - 27023ms

select exists(select null from loga limit 1)
true
1 row(s) fetched - 2ms

我想 13511,快 5 倍就足够了。 :D

最佳答案

特别懒

你可以看看extra-lazy associations .

基本上,您像往常一样映射所有关联,并添加 fetch="EXTRA_LAZY":

/**
* @Entity
*/
class CmsGroup
{
/**
* @ManyToMany(targetEntity="CmsUser", mappedBy="groups", fetch="EXTRA_LAZY")
*/
public $users;
}

现在 Doctrine 将不会在第一次访问时将完整集合加载到内存中,而是执行专门的查询来加载您实际需要的部分在那一刻需要。

因此集合上的 $users->count()(或 count($users))将触发一个简单的计数查询,而不是加载完整的集合进入内存。

加载后

你可以使用 postLoad事件以确定此类实体是否可删除。此 postLoad 事件在 EntityManager 构造实体后调用,因此在加载实体时调用。

为实体添加一个未映射的属性($isDeletable),用于存储实体是否可以删除。

创建一个 entity listener监听 postLoad 事件。监听器可以注入(inject) EntityManager、DBAL Connection 或任何其他内容。有了这种依赖性,您就可以执行任何您想要的查询,并使用结果来设置 $isDeletable

结果是加载实体时的单个附加查询,之后实体“知道”它是否可删除。

可以在 Cookbook entry on the Strategy Pattern 中找到使用 postLoad 事件的示例

请注意,当确定它是否可删除的条件发生变化时,$isDeletable 的值可能会变得不正确。要解决此问题,您可以跟踪这些情况:

保持跟踪

为实体添加一个mapped 属性($isDeletable),存储实体是否可以删除。它可能以 true 开头。

当某些东西被添加到关联中意味着实体不再可删除时,将 $isDeletable 设置为 false

当某些东西从关联中删除,这意味着该实体再次可删除时,将 $isDeletable 设置为 true

换句话说:对于每次更改,您都会跟踪实体是否可删除。

这样您就根本不需要任何额外的查询。

有一个 Cookbook entry on aggregate fields这很好地解释了这个概念。

关于php - 实体中的 Doctrine isDeletable 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32317500/

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