Php doctrine2关联未初始化
我的课程如下:Php doctrine2关联未初始化,php,symfony,doctrine,doctrine-orm,Php,Symfony,Doctrine,Doctrine Orm,我的课程如下: /** @Entity **/ class orgGroup{ //id and stuff... /** * @Column(type="string") **/ private $name; /** * @Column(type="string", nullable=true) **/ private $description; /** * @ManyToOne(targ
/** @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"}
所以有两个错误。。。我不知道为什么。
数据库中的所有数据都已正确设置
有什么想法吗
编辑:
下面是我的orgGroupType-entity缺少的代码
/** @Entity **/
class orgGroupType {
/**
* @OneToMany(targetEntity="orgGroup", mappedBy="_orgGroupType")
**/
private $_orgGroups;
public function __construct()
{
$this->_orgGroups = new ArrayCollection();
}
}
确保在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;
在我看来,这是一个延迟加载问题。如何将对象中的数据输入Webservice应答 如果不配置其他内容,Doctrine2是延迟加载,这意味着
$groups=$em->getRepository(“orgGroup”)->findAll()
不会返回真实的orgGroup
对象,而是返回代理对象()
这意味着在调用$group->getDescription()
或$group->getOrgGroupType()
或$group->getOrgGroupType()
之前,$group
对象不会有其描述或orgGroupType值(然后Doctrine会自动加载它们),因此在将数据写入Web服务的JSON响应之前需要这样做。如果在不使用getter方法的情况下以某种方式循环对象属性,那么它将不起作用
我希望这就是问题所在:)尝试将fetch模式更改为EAGER
@ORM\ManyToOne(targetEntity="****", fetch="EAGER").
这对我有用
//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类的代码,但它的实现与您发布的一样。我将缺少的代码追加到了我的第一篇文章中。您还有其他想法吗:-)?\u从数据库检索对象时不会调用构造OK。一个问题是,我的WebService函数没有将数据正确打包到json对象中。当我不访问orgGroupType对象时,它不会被初始化。但在我访问过一次之后,我可以很容易地将它打包。。。但是描述属性的另一个问题仍然没有解决。它只是一个字符串,我从entityManager得到“null”。在数据库中,我的对象看起来像:id:1 name:AdministratorGroup description:some description _orgGroupType:1,但entityManager给我的是:id:1 name:AdministratorGroup description:null _orgGroupType:1Did你只是在实体上调用json_encode?是的,类似于json_encode。这是第一个问题。但是“unset”description属性的另一个问题仍然没有解决…您的代码没有问题,尝试使用XDebugh观察代码中发生的情况,但是访问属性或调用自写的getter方法之间有什么区别?代理类从实体类继承并重写getter-如果调用它们,它们将调用\u load
方法或类似方法,并从数据库中读取所需的数据。如果只调用object->property
,那么代理类就无法启动延迟加载。这里有一个类似的问题:@Manuel?你是如何解决这个问题的?还有一个关于DoctrineCollection的问题,谢谢你的回答!我使用Symfony已经三年了,我不明白为什么有时候我的联想是空的。。。使用Twig中的“get”函数解决了我的问题。例如,我编写了{{product.type.name}}
而不是{{product.getType.name}}