9

我有一个像下面这样的类:

/** @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 的所有者,它只是一个对象而不是数组。我的网络服务总是说:

{"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

4 回答 4

32

尝试将获取模式更改为EAGER

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

它对我有用。

于 2017-01-20T11:52:19.973 回答
21

在我看来,这就像一个延迟加载问题。您如何将对象中的数据获取到 Web 服务答案中?

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

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

我希望这是问题:)

于 2012-11-19T12:27:53.353 回答
2
//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 没有它的情况下相同,它在我的数据库中没有做任何事情

于 2018-10-02T15:49:30.407 回答
1

请务必在 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;
于 2012-11-17T14:53:46.360 回答