doctrine2关联未初始化

Lao*_*oon 1 php doctrine symfony doctrine-orm

我有一个类如下:

/** @Entity **/
class orgGroup{

    //id and stuff...

    /**
     * @Column(type="string")
     **/
    private $name;

    /**
     * @Column(type="string", nullable=true)
     **/
    private $description;

    /**
     * @ManyToOne(targetEntity="orgGroupType", inversedBy="_orgGroups")
     * @JoinColumn(name="_orgGroupType")
     **/

    private $_orgGroupType;

    //...
}
Run Code Online (Sandbox Code Playgroud)

但是当我通过我的数据库加载此对象时

$groups = $em->getRepository("orgGroup")->findAll();
Run Code Online (Sandbox Code Playgroud)

我只是正确地得到了名称而不是_orgGroupType ...我不知道为什么... OrgGroup是orgGroupType的所有者,它只是一个对象而不是数组.我的Web服务总是说:

{"error":[],"warning":[],"message":[],"data":[{"name":"AdministratorGroup","description":null,"_orgGroupType":{"__ isInitialized __":false}}]}
Run Code Online (Sandbox Code Playgroud)

结果是:

"name":"AdministratorGroup",
"description":null,
"_orgGroupType":{"__ isInitialized __":false}
Run Code Online (Sandbox Code Playgroud)

但应该是:

"name":"AdministratorGroup",
"description":"some description",
"_orgGroupType":{name:"test"}
Run Code Online (Sandbox Code Playgroud)

所以有2个错误......我不明白为什么.所有数据都在数据库中正确设置.

有任何想法吗?

编辑:这是我的orgGroupType -entity缺少的代码

/** @Entity **/
class orgGroupType {
    /**
     * @OneToMany(targetEntity="orgGroup", mappedBy="_orgGroupType")
     **/
    private $_orgGroups;

    public function __construct()
    {
        $this->_orgGroups = new ArrayCollection();
    }
}
Run Code Online (Sandbox Code Playgroud)

小智 25

尝试将获取模式更改为EAGER.

@ORM\ManyToOne(targetEntity="****", fetch="EAGER"). 
Run Code Online (Sandbox Code Playgroud)

它对我有用.


Man*_*uel 15

这看起来像是一个懒惰加载问题.如何将对象中的数据导入Webservice答案?

如果你没有配置其他东西,Doctrine2是延迟加载的,这意味着你$groups = $em->getRepository("orgGroup")->findAll();不会返回真实orgGroup对象,而是代理对象(Doctrine Documentation).

这意味着在$group您调用$group->getDescription()$group->getOrgGroupType()(然后Doctrine自动加载它们)之前,对象将不具有它的描述或orgGroupType值,因此您需要在将数据写入Web服务的JSON响应之前执行此操作.如果以某种方式在不使用getter方法的情况下遍历对象属性,它将无法工作.

我希望那是问题:)

  • Proxy 类继承自您的实体类并覆盖您的 Getters - 如果您调用它们,它们会调用 `_load` 方法或类似方法并从数据库中读取您想要的数据。如果你只是调用`object->property`,那么代理类就无法启动延迟加载。这是一个有类似问题的问题:http://stackoverflow.com/questions/4090609/how-can-public-fields-break-lazy-loading-in-doctrine-2 (3认同)