gpt4 book ai didi

php - Doctrine 2 Symfony 2 在没有映射的情况下获取外键实体

转载 作者:可可西里 更新时间:2023-11-01 08:26:23 26 4
gpt4 key购买 nike

所以我对 Symfony 和 Doctrine 还很陌生。我想知道是否有一种方法可以询问 doctrine 有哪些外键,而不必在模型中映射关系。

例如,假设您有 CoreBundle:Company,它总是会出现,然后您有 OptionalBundle:Client,它将使用 扩展 Company @OneToOne 映射关系,自己多加几个字段。问题是,由于 OptionalBundle 可能不存在,我不希望从 CoreBundleOptionalBundle 的显式映射。

现在假设一个用户出现并试图删除 Company(5)。如果实体被完全映射,它会通过级联删除两者,但由于 bundle 不会意识到映射关系,它最终只会删除公司 - 我想产生一个错误而不是级联删除。

如果这很容易实现,那么我还想更进一步,说哪些实体(class 和 id)有外键,我可以向用户显示数据,比如

@CoreBundle:Company(5) ->
has @OptionalBundle:Client(3) linked, and
has @AnotherOptionalBundle:Supplier(12) linked

我的第一直觉是为外键执行自定义 INFORMATION_SCHEMA 查找,但这只会给我表名...

PS 我真的不想使用任何第三方供应商,因为我喜欢尝试降低依赖性,即使这意味着重新发明轮子

最佳答案

问题一

您可以将Client 设置为一对一关系的所有者。但是,根据您的用例,它可能并不理想,但如果它适合您,它确实是最简单的解决方案,如 ABM_Dan 所指出的。

除此之外,最好的选择可能是使用 Doctrine event subscribers并 Hook preDelete 事件,在 Company 本身被删除之前,您将在其中删除关联的 Client - 如果级联删除确实是你想要什么。

默认情况下,这两个删除将在同一个 Doctrine 事务中,这意味着如果在删除 Company 时出现问题,则 Client 删除将被取消。

如果你真的想触发错误而不是这种“手动级联”,也可以在 Doctrine 订阅者的 preDelete 方法中实现。

订阅者类可以驻留在您的可选包中,即使它会作用于与 Company 关联的事件。

Doctrine 事件订阅者与常规的 Symfony 事件系统是分开的。新手往往意识不到它的存在,但它可以实现很多有趣的事情。

问题二

仍然在您的事件订阅者中,可以 Hook postLoad 事件。这将允许您请求数据库并将相关实体直接加载到 Company 中。您可以在每个需要它的包中为 Company 创建一个事件订阅者。

虽然这是可能的,但我真的想知道是否有更好的方法。使用 decorators可能是更好的解决方案。我找到了一个 Doctrine cookbook article关于它。

关于php - Doctrine 2 Symfony 2 在没有映射的情况下获取外键实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35132874/

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