是否有可能使用关联而不是教义2中的代理类来获取“完整”对象?
因为我正在序列化实体(和关系),但是当我反序列化时,我只是得到一个代理类。
我正在做的查询:
public function getSnippet($id)
{
return $this->getEntityManager()->getRepository('GvnSnippetryBundle:Snippet')->findOneBy(array('id' => $id));
}
答案 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 Objects和Association Mapping章节以获取更详细的说明和代码示例。