>我有一个像这样的类:
/** @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 个错误...我不知道为什么。所有数据在数据库中都已正确设置。
有什么想法吗?
编辑:这是我的组织组类型-实体的缺失代码
/** @Entity **/
class orgGroupType {
/**
* @OneToMany(targetEntity="orgGroup", mappedBy="_orgGroupType")
**/
private $_orgGroups;
public function __construct()
{
$this->_orgGroups = new ArrayCollection();
}
}
尝试将获取模式更改为 EAGER。
@ORMManyToOne(targetEntity="****", fetch="EAGER").
它对我有用。
,这看起来像是一个延迟加载问题。如何将对象中的数据获取到 Web 服务答案中?
如果您不配置其他内容,则 Doctrine2 是延迟加载的,这意味着您的$groups = $em->getRepository("orgGroup")->findAll();
不会返回实际的orgGroup
对象,而是返回代理对象(原则文档)。
这意味着$group
对象在调用$group->getDescription()
或$group->getOrgGroupType()
之前不会有它的描述或 orgGroupType 值(然后 Doctrine 会自动加载它们),因此您需要在将数据写入 Web 服务的 JSON 响应之前执行此操作。如果您以某种方式循环访问对象属性而不使用 getter 方法,它将不起作用。
我希望这就是问题所在:)
//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
相同没有它,它在我的数据库中没有做任何事情
请务必在 orgGroupType 实体中初始化 orgGroups 集合
/**
* @OneToMany(targetEntity="orgGroup", mappedBy="_orgGroupType")
*/
protected $orgGroups ;
public function __construct() {
$this->orgGroups = new ArrayCollection();
}
您可能需要在实体中包含以下内容
use DoctrineCommonCollectionsCollection,
DoctrineCommonCollectionsArrayCollection;