【发布时间】:2015-08-31 18:22:07
【问题描述】:
我的数据库中有一个实体(比如成员),它与其他表有很多关系(准确地说是 6 个关系)。其中一些我不想用 ORM 映射(我的意思是链接到这个实体),因为它们可能有很多记录(例如 MemberAccessLogs),而其他一些则加载了许多其他实体。
现在我希望这个成员实体有一个 isDeletable 方法,这样我就可以禁用管理页面中的排除按钮。
如果我以传统方式执行此操作,我将必须声明与实体类中所有其他表的关联,包括 MemberAccessLogs,并且我会将方法放入其中,以便测试这些关联是否为空。
但是 AFAIU,我必须对关联的表进行提取(或至少计数)以检查是否为空。
另一种方法是获取我想要显示的成员,然后进行单独的查询以检查这些子表中是否存在低成本的空(从表限制 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
【问题讨论】:
-
我看不出
select * from table limit 1比count(*) from table更有效。 -
包含在这个问题上的编辑。
-
如果你愿意贡献(即使没有),请考虑创建一个 PR 让
Doctrine\ORM\PersistentCollection::isEmpty()按照你的描述去做。看起来这可能是一个相当不错的优化。您的问题的解决方案也会变得更容易;) -
好的。我在。问题是时间。但是我会在星期二回去工作时检查一下。 :)
标签: php symfony doctrine-orm twig