1

我有类用户,并与类文章的关系:

/**
 * @ORM\OneToMany(targetEntity="Article", mappedBy="author", cascade={"persist"})   
 * @var ArrayCollection $articles
 */
protected $articles;

在课堂文章中,我有相反的关系:

/**
* @ORM\ManyToOne(targetEntity="User", inversedBy="articles")
* @ORM\JoinColumn(name="author_id", referencedColumnName="id") 
*/
protected $author;

我使用以下方式获取文章:

    $article = $this->getDoctrine()
            ->getRepository("IftodiDesignBundle:Article")
            ->findOneBy(array(
                'title' => $title,
            ));

当我尝试获取用户时:

 $article->getAuthor();

var_dump 返回:

    object(Proxies\IftodiDesignBundleEntityUserProxy)[305]
    private '_entityPersister' => 
        object(Doctrine\ORM\Persisters\BasicEntityPersister)[309]
        protected '_class' => 
            object(Doctrine\ORM\Mapping\ClassMetadata)[113]
            public 'reflFields' => 
                array (size=8)
                ...
            private '_prototype' => null
            public 'name' => string 'Iftodi\DesignBundle\Entity\User' (length=31)
            public 'namespace' => string 'Iftodi\DesignBundle\Entity' (length=26)
            public 'rootEntityName' => string 'Iftodi\DesignBundle\Entity\User' (length=31)
            public 'customRepositoryClassName' => null
            public 'isMappedSuperclass' => boolean false
            public 'parentClasses' => 
                array (size=0)
                ...
            public 'subClasses' => 
                array (size=0)
                ...
            public 'namedQueries' => 
                array (size=0)
                ...
            public 'identifier' => 
                array (size=1)
                ...
            public 'inheritanceType' => int 1
            public 'generatorType' => int 4
            public 'fieldMappings' => 
                array (size=7)
                ...
            public 'fieldNames' => 
                array (size=7)
                ...
            public 'columnNames' => 
                array (size=7)
                ...
            public 'discriminatorValue' => null
            public 'discriminatorMap' => 
                array (size=0)
                ...
            public 'discriminatorColumn' => null
            public 'table' => 
                array (size=1)
                ...
            public 'lifecycleCallbacks' => 
                array (size=0)
                ...
            public 'associationMappings' => 
                array (size=1)
                ...
            public 'isIdentifierComposite' => boolean false
            public 'containsForeignIdentifier' => boolean false
            public 'idGenerator' => 
                object(Doctrine\ORM\Id\IdentityGenerator)[101]
                ...
            public 'sequenceGeneratorDefinition' => null
            public 'tableGeneratorDefinition' => null
            public 'changeTrackingPolicy' => int 1
            public 'isVersioned' => null
            public 'versionField' => null
            public 'reflClass' => 
                object(ReflectionClass)[112]
                ...
            public 'isReadOnly' => boolean false
        protected '_conn' => 
            object(Doctrine\DBAL\Connection)[120]
            protected '_conn' => 
                object(Doctrine\DBAL\Driver\PDOConnection)[356]
                ...
            protected '_config' => 
                object(Doctrine\DBAL\Configuration)[127]
                ...
            protected '_eventManager' => 
                object(Doctrine\Common\EventManager)[124]
                ...
            protected '_expr' => 
                object(Doctrine\DBAL\Query\Expression\ExpressionBuilder)[119]
                ...
            private '_isConnected' => boolean true
            private '_transactionNestingLevel' => int 0
            private '_transactionIsolationLevel' => int 2
            private '_nestTransactionsWithSavepoints' => null
            private '_params' => 
                array (size=7)
                ...
            protected '_platform' => 
                object(Doctrine\DBAL\Platforms\MySqlPlatform)[118]
                ...
            protected '_schemaManager' => null
            protected '_driver' => 
                object(Doctrine\DBAL\Driver\PDOMySql\Driver)[121]
                ...
            private '_isRollbackOnly' => boolean false
        protected '_platform' => 
            object(Doctrine\DBAL\Platforms\MySqlPlatform)[118]
            protected 'doctrineTypeMapping' => null
            protected 'doctrineTypeComments' => null
        protected '_em' => 
            object(Doctrine\ORM\EntityManager)[117]
            private 'config' => 
                object(Doctrine\ORM\Configuration)[128]
                ...
            private 'conn' => 
                object(Doctrine\DBAL\Connection)[120]
                ...
            private 'metadataFactory' => 
                object(Doctrine\ORM\Mapping\ClassMetadataFactory)[116]
                ...
            private 'repositories' => 
                array (size=3)
                ...
            private 'unitOfWork' => 
                object(Doctrine\ORM\UnitOfWork)[115]
                ...
            private 'eventManager' => 
                object(Doctrine\Common\EventManager)[124]
                ...
            private 'hydrators' => 
                array (size=0)
                ...
            private 'proxyFactory' => 
                object(Doctrine\ORM\Proxy\ProxyFactory)[114]
                ...
            private 'expressionBuilder' => null
            private 'closed' => boolean false
        protected '_queuedInserts' => 
            array (size=0)
            empty
        protected '_rsm' => null
        protected '_columnTypes' => 
            array (size=0)
            empty
        private '_insertSql' => null
        protected '_selectColumnListSql' => null
        protected '_selectJoinSql' => null
        protected '_sqlAliasCounter' => int 0
        protected '_sqlTableAliases' => 
            array (size=0)
            empty
    private '_identifier' => 
        array (size=1)
        'id' => string '1' (length=1)
    public '__isInitialized__' => boolean false
    protected 'id' => null
    protected 'username' => null
    protected 'name' => null
    protected 'email' => null
    protected 'password' => null
    protected 'salt' => null
    protected 'role' => null
    protected 'articles' => null

请帮助我建立正确的关系并使用文章实体获取用户。

我将 Symfony2 与 Doctrine 一起使用。

编辑:

这是文章实体: http: //pastebin.com/ZBQPehGL 这是用户实体: http: //pastebin.com/McEYdZ9W

Profiler 不显示此查询:

 $articles = $this->getDoctrine()
            ->getRepository("IftodiDesignBundle:Article")
            ->findAll();
4

1 回答 1

2

我相信这是 Doctrine Entity Proxies 的正确行为。

由于您的 findOneBy() 调用不会将作者加入数据库中,因此 Doctrine 不会水合相关的作者对象,而是提供一个代理对象而不是作者的“真实”实体,以将数据库查询减少到真正需要的那些。

尝试访问作者的属性(如 $article->getAuthor()->getName())并在此之后再次对作者对象进行 var_dump。现在您应该看到“真实的”athor 实体。发生这种情况是因为访问作者的数据将“触发”代理类自动从数据库加载数据。

进一步阅读:

PS:请注意,按照我建议的方式访问作者将导致额外的数据库选择查询。如果您知道您将始终需要文章的作者数据,您应该在选择文章的查询中添加一个连接以减少查询量;)

于 2012-07-08T07:20:36.130 回答