Php 条令2 Symfony 2无映射获取外键实体
所以我对Symfony和学说是相当陌生的。我想知道是否有一种方法可以询问哪些外键在适当的位置,但不必映射模型中的关系 例如,假设您有始终存在的Php 条令2 Symfony 2无映射获取外键实体,php,mysql,symfony,orm,doctrine-orm,Php,Mysql,Symfony,Orm,Doctrine Orm,所以我对Symfony和学说是相当陌生的。我想知道是否有一种方法可以询问哪些外键在适当的位置,但不必映射模型中的关系 例如,假设您有始终存在的CoreBundle:Company,然后您有OptionalBundle:Client,它将使用@OneToOne映射关系扩展Company,并在自身中添加更多字段。问题是,由于OptionalBundle可能不存在,我不希望从CoreBundle到OptionalBundle的显式映射 现在假设一个用户出现并试图删除公司(5)。如果实体被完全映射,它将
CoreBundle:Company
,然后您有OptionalBundle:Client
,它将使用@OneToOne
映射关系扩展Company,并在自身中添加更多字段。问题是,由于OptionalBundle
可能不存在,我不希望从CoreBundle
到OptionalBundle
的显式映射
现在假设一个用户出现并试图删除公司(5)
。如果实体被完全映射,它将通过级联删除这两个实体,但是由于捆绑包不知道映射的关系,它将只删除公司-我想产生一个错误,而不是级联删除
如果这很容易实现,那么我还想进一步说,哪些实体(类和id)有外键,我可以向用户显示数据,比如
@CoreBundle:Company(5) ->
has @OptionalBundle:Client(3) linked, and
has @AnotherOptionalBundle:Supplier(12) linked
我的第一反应是对外键进行自定义信息模式查找,但这只会给我表名
PS我真的不喜欢使用任何第三方供应商,因为我喜欢尝试降低依赖性,即使这意味着重新设计轮子我遇到的唯一想法是在没有辅助捆绑包的情况下,在编译器传递期间使用某种回退类型预先创建类映射
在编译器过程中,检查容器是否加载了辅助捆绑包,并使用调整路径的
DoctrineOrmMappingsPass::createxmlmmappingdriver
。如果找到-映射辅助捆绑包的实体,如果没有-将其映射为null(例如)。您是否考虑过将关系定义为OptionalBundle端所有?问题1
您可以将客户端设置为1对1关系的所有者。然而,根据您的用例,它可能并不理想,但如果对您有效,它将是最简单的解决方案,正如ABM_Dan所指出的那样
除此之外,您最好的选择可能是使用并钩住preDelete
事件,在公司本身被删除之前删除相关的客户端
——如果级联删除确实是您想要的
默认情况下,两次删除将在同一条原则事务中进行,这意味着如果在删除公司
时出现问题,则客户
删除将被取消
如果您真的想触发错误而不是这种“手动级联”类型,也可以在Doctrine订阅服务器的preDelete
方法中触发
订户类可以驻留在您的可选捆绑包中,即使它将对与公司关联的事件执行操作
条令事件订阅者独立于常规Symfony事件系统。新来者通常不知道它的存在,但它可以实现许多有趣的事情
问题2
仍然可以在事件订阅服务器中挂接postLoad
事件。这将允许您请求数据库并将相关实体直接加载到公司
。您可以在每个需要它的捆绑包中为公司
创建事件订阅服务器
虽然这是可能的,但我真的想知道是否有更好的方法。使用可能是更好的解决方案。我找到了一个关于它的答案