Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/239.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 条令2 Symfony 2无映射获取外键实体_Php_Mysql_Symfony_Orm_Doctrine Orm - Fatal编程技术网

Php 条令2 Symfony 2无映射获取外键实体

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)。如果实体被完全映射,它将

所以我对Symfony和学说是相当陌生的。我想知道是否有一种方法可以询问哪些外键在适当的位置,但不必映射模型中的关系

例如,假设您有始终存在的
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
事件。这将允许您请求数据库并将相关实体直接加载到
公司
。您可以在每个需要它的捆绑包中为
公司
创建事件订阅服务器

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