【问题标题】:Serialized proxy classes Doctrine 2序列化代理类 Doctrine 2
【发布时间】:2011-09-02 12:12:44
【问题描述】:

是否有可能获得具有关联的“完整”对象而不是学说 2 中的代理类?

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

我正在做的查询:

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

【问题讨论】:

    标签: php symfony doctrine-orm


    【解决方案1】:

    J0HN 的回答很好。

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

    1) 加入关联实体 2) 在 SELECT 中引用该实体

    所以,在 DQL 中:

    SELECT f 
    FROM Foo f
    JOIN f.Bar b
    

    这将加载关联的 Bar,因为它没有在 SELECT 中引用——您将获得一个代理,而

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

    将强制学说获取并加入您的酒吧。

    HTH

    【讨论】:

    • 哦,感谢您的精彩提示!正是我需要的!
    【解决方案2】:

    从未亲自尝试过(也没有触手可及的 Doctrine2),但 marking association as EAGER 应该可以解决问题。但是,您将始终以这种方式加载那些关联的对象。

    作为一种解决方法,请尝试在序列化之前访问关联的实体。例如。如果您遵循了封装关联对象集合的建议(并且您真的应该遵循它),您只需使用$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 章节以获得更详细的描述和代码示例。

    【讨论】:

      猜你喜欢
      • 2011-09-21
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      • 1970-01-01
      • 2011-05-20
      • 1970-01-01
      • 2011-06-22
      • 1970-01-01
      相关资源
      最近更新 更多