我是Symfony / Doctrine的新手。 我创建了2个实体来管理附加到它们的一些注释和文档: 这是comment entity,此处是comment document entity。 现在的问题是从db获取数据时这样:
$comment = $em->getRepository('PathToBundle:Comment')->findOneBy(
array('ordernumber' => '123456')
);
并且,我们说我不打算调试它,所以我
print_r($comment);
打印出类似这样的内容:
Path\ToBundle\Entity\Comment Object
(
[id:Path\ToBundle\Entity\Comment:private] => 1
[ordernumber:Path\ToBundle\Entity\Comment:private] => 123456
[category:Path\ToBundle\Entity\Comment:private] => cat1
[comment:Path\ToBundle\Entity\Comment:private] => com1
[user:Path\ToBundle\Entity\Comment:private] => usr1
[version:Path\ToBundle\Entity\Comment:private] => 0
[documents:Path\ToBundle\Entity\Comment:private] => Doctrine\ORM\PersistentCollection Object
(
[snapshot:Doctrine\ORM\PersistentCollection:private] => Array
(
)
[owner:Doctrine\ORM\PersistentCollection:private] => Path\ToBundle\Entity\Comment Object
*RECURSION*
[association:Doctrine\ORM\PersistentCollection:private] => Array
(
[fieldName] => documents
[mappedBy] => comment
[targetEntity] => Path\ToBundle\Entity\CommentDocument
[cascade] => Array
(
)
[orphanRemoval] =>
[fetch] => 2
[type] => 4
[inversedBy] =>
[isOwningSide] =>
[sourceEntity] => Path\ToBundle\Entity\Comment
[isCascadeRemove] =>
[isCascadePersist] =>
[isCascadeRefresh] =>
[isCascadeMerge] =>
[isCascadeDetach] =>
)
它刚刚开始,它一直持续到浏览器崩溃为止。但如果尝试访问单个属性,如
print_r($input->getComment());
一切正常。
这种行为是正常的,还是我做错了什么?如何访问关联的文档表值?
答案 0 :(得分:1)
这种行为非常令人期待。 Doctrine提供的Entity对象具有填充到其中的 lot 功能。转储原始对象将输出大量数据。
也就是说,您不应该转储Entity(或任何大型Class)对象。如果需要调试信息,请将输出限制为仅相关的内容。
我也认为你误解了像Doctrine这样的ORM的目的。
如何访问关联的文档表值?
虽然通过Doctrine的类元数据工厂访问原始数据库功能(如表信息)在技术上是可行的,但简短的答案是您不希望这样做。 Doctrine取消了底层的db结构,试图剥离该抽象,否定了首先使用ORM的全部原因。
专注于利用Doctrine为您提供的工具;引擎盖下发生的事情并不那么重要,特别是初学者。
(当然,这个论点的另一面是对平台内部工作的了解对于高级技术至关重要,例如使用自定义代码扩展基本Doctrine功能。但初学者不应尝试这样做。机会是你可以用现有的工具做你需要的。)
答案 1 :(得分:1)
这是正常的。请注意,您的第一次print_r
尝试是在Doctrine对象上,第二次是在字符串上。 Doctrine对象的层次很深,包含很多信息。而不是使用print_r
尝试使用Doctrine的Debug
类,它允许您指定最大深度。
http://www.doctrine-project.org/api/common/2.4/class-Doctrine.Common.Util.Debug.html
\Doctrine\Common\Util\Debug::dump($comment, $maxDepth)
如果您的实体设置正确,您应该能够通过
访问相关文档$comments->getDocuments();