doctrine2关联未初始化

时间:2012-11-17 14:42:46

标签: php symfony doctrine 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;

    //...
}

但是当我通过

从我的数据库加载这个对象时
$groups = $em->getRepository("orgGroup")->findAll();

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

{"error":[],"warning":[],"message":[],"data":[{"name":"AdministratorGroup","description":null,"_orgGroupType":{"__ isInitialized __":false}}]}

结果是:

"name":"AdministratorGroup",
"description":null,
"_orgGroupType":{"__ isInitialized __":false}

但应该是:

"name":"AdministratorGroup",
"description":"some description",
"_orgGroupType":{name:"test"}

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

任何想法?

编辑: 这是我的orgGroupType -entity

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

    public function __construct()
    {
        $this->_orgGroups = new ArrayCollection();
    }
}

4 个答案:

答案 0 :(得分:22)

尝试将获取模式更改为 EAGER

@ORM\ManyToOne(targetEntity="****", fetch="EAGER"). 

它对我有用。

答案 1 :(得分:14)

这对我来说就像一个懒惰的装载问题。如何将对象中的数据导入Webservice答案?

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

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

我希望那是问题:)

答案 2 :(得分:0)

确保初始化orgGroupType实体中的orgGroups集合

/**
 * @OneToMany(targetEntity="orgGroup", mappedBy="_orgGroupType")
 */
protected $orgGroups ;

public function __construct() {
    $this->orgGroups = new ArrayCollection();
}

您可能需要在实体中包含以下内容

use Doctrine\Common\Collections\Collection,
Doctrine\Common\Collections\ArrayCollection;

答案 3 :(得分:0)

//Group.php ...

public function addUser(User $user): self
{
    if (!$this->users->contains($user)) {
        $this->users[] = $user;
        $user->addJoinedGroup($this);     /** VERY IMPORTANT **/
    }
    return $this;
}

User.php中的相同 没有它,它就不会在我的数据库中做任何事情