Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
Doctrine orm 您可以从Doctrine2中的对象获取外键而不加载该对象吗?_Doctrine Orm - Fatal编程技术网

Doctrine orm 您可以从Doctrine2中的对象获取外键而不加载该对象吗?

Doctrine orm 您可以从Doctrine2中的对象获取外键而不加载该对象吗?,doctrine-orm,Doctrine Orm,我在一个活动网站上工作,在一个产品和它的性能之间有一对多的关系,当我有一个性能对象时,如果我现在需要它的产品id,我必须这样做 $productionId = $performance->getProduction()->getId(); 如果我真的只需要生产id,那么发送另一个数据库查询以获取某个对象中已经存在的值似乎是一种浪费。 有办法吗?编辑2013.02.17: 我在下面写的不再是真的在问题中概述的场景中,您无需执行任何操作,因为Doctrine足够聪明,可以将id字段加载

我在一个活动网站上工作,在一个产品和它的性能之间有一对多的关系,当我有一个性能对象时,如果我现在需要它的产品id,我必须这样做

$productionId = $performance->getProduction()->getId();
如果我真的只需要生产id,那么发送另一个数据库查询以获取某个对象中已经存在的值似乎是一种浪费。 有办法吗?

编辑2013.02.17:
我在下面写的不再是真的在问题中概述的场景中,您无需执行任何操作,因为Doctrine足够聪明,可以将id字段加载到相关实体中,因此代理对象将已经包含id,并且不会对数据库发出另一个调用

答案如下:

这是可能的,但并不明智

这背后的原因是,条令试图真正坚持这样一个原则,即您的实体应该形成一个对象图,其中外键没有位置,因为它们只是来自关系数据库工作方式的“工件”

你应该把这个协会改写成

  • 如果您始终需要相关实体,请立即加载
  • 编写一个DQL查询(最好是在存储库上)以获取并加入相关实体
  • 让它通过调用getter延迟加载相关实体
如果您不相信,并且确实希望避免上述所有情况,那么有两种方法(我知道),可以获取相关对象的id,而无需触发加载,也无需使用反射和序列化之类的技巧:

如果您已经拥有该对象,则可以检索Doctrine内部使用的内部
UnitOfWork
对象,并使用其方法,将卸载的实体(代理对象)传递给它。它将返回id,而不会触发延迟加载

假设您具有多对一关系,且多个项目属于一个类别:

$articleId = 1;
$article = $em->find('Article', $articleId);
$categoryId = $em->getUnitOfWork()->getEntityIdentifier($article->getCategory());
在2.2版本中,您将能够使用IDENTITY DQL函数仅选择一个外键,如下所示:

SELECT IDENTITY(u.Group) AS group_id FROM User u WHERE u.id = ?0
这是开发版本的关键


尽管如此,您还是应该尝试使用其中一种“正确”的方法。

这是一个很好的问题-我一直都遇到这个问题,希望找到一种直接访问外键值的方法,而不必每次都加入该协会。感谢您的回答,尝试一下,效果非常好!例如,我想做的是生成推荐,我有很多性能,需要生产ID,这样我就可以将它们传递给一个对象,该对象将根据生产ID生成推荐。因此,当我不需要产品时,加载产品似乎有点不必要,我也不想拥有两个版本的推荐系统。我理解你关于使用正确系统的观点,但在本例中,获取ID似乎是最简单的方法。有许多用例,你只需要相关对象的ID。我认为为了进行性能调整,最好打破OOP的概念。最后,这只是一种帮助,不应减慢您的应用程序。我很感谢Noberts的解决方案,但他在概念上的立场并不支持。编辑后的版本能处理id为空的情况吗?