Symfony2 Doctrine关联结果

时间:2014-06-27 22:52:14

标签: symfony doctrine-orm associations entity

我是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());

一切正常。

这种行为是正常的,还是我做错了什么?如何访问关联的文档表值?

2 个答案:

答案 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();