序列化代理类Doctrine 2

时间:2011-09-02 12:12:44

标签: php symfony doctrine-orm

是否有可能使用关联而不是教义2中的代理类来获取“完整”对象?

因为我正在序列化实体(和关系),但是当我反序列化时,我只是得到一个代理类。

我正在做的查询:

public function getSnippet($id)
    {
        return $this->getEntityManager()->getRepository('GvnSnippetryBundle:Snippet')->findOneBy(array('id' => $id));
    }

2 个答案:

答案 0 :(得分:2)

J0HN的答案很好。

如果您想要更专注,可以通过创建自定义查询(直接在DQL中或使用QueryBuilder)强制Doctrine获取连接关联实体。要强制加载关联,您需要:

1)加入关联实体 2)在SELECT

中引用该实体

所以,在DQL中:

SELECT f 
FROM Foo f
JOIN f.Bar b

这将加载关联栏,因为它未在SELECT中引用 - 您将获得代理,而

SELECT f, b
FROM Foo f
JOIN f.Bar b

将强制学说取得你的酒吧。

HTH

答案 1 :(得分:1)

从未亲自尝试过(并且没有指尖上的Doctrine2),但是marking association as EAGER应该可以做到。 Hovewer,你总是这样加载那些相关的对象。

作为解决方法,请在序列化之前尝试访问关联的实体。例如。如果您已按照建议封装关联对象集合(并且您确实应该遵循它),则只需使用$snippet->howDidYouCallFunctionThatReturnCollection()访问它。 Doctrine拦截对Collection检查的请求,表明它已填充代理并自动加载。所以,它应该是这样的:

class Snippet{
     //other declarations
    /** OneToMany(targetEntity='Blah', ...)*/
    protected $associations;

    public function getAssociations(){
        return $this->associations; //fills proxies with real data here
    }
}

public function getSnippet($id)
{
    $snippet = $this->getEntityManager()->getRepository('GvnSnippetryBundle:Snippet')->findOneBy(array('id' => $id));
    $snippet->getAssociations(); //gets only one association
    $snippet->getAssociations2(); //and so on
    return $snippet;
}

请注意,这不是完整的代码示例,但我假设您知道如何映射关联。无论如何,请查看Working with ObjectsAssociation Mapping章节以获取更详细的说明和代码示例。