【问题标题】:doctrine2 association is not initialized教义2关联未初始化
【发布时间】:2012-11-17 14:42:46
【问题描述】:

我有一个类如下:

/** @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();
    }
}

【问题讨论】:

  • 你刚刚在你的实体上调用了 json_encode 吗?
  • 是的,类似于 json_encode。这是第一个问题。但是“未设置”描述属性的另一个问题仍未解决......
  • 你的代码没有问题,试着用xdebug观察代码发生了什么

标签: php symfony doctrine doctrine-orm


【解决方案1】:

尝试将获取模式更改为EAGER

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

它对我有用。

【讨论】:

  • 如果另一边有很多实体并且您不一定需要它们,那么这是一个坏主意。它们会无缘无故地被加载。
【解决方案2】:

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

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

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

我希望这就是问题所在:)

【讨论】:

  • 但是访问属性和调用自写的getter方法有什么区别呢?
  • 代理类从您的实体类继承并覆盖您的 Getter - 如果您调用它们,它们会调用 _load 方法或类似的方法并从数据库中读取您想要的数据。如果您只是调用object->property,那么 Proxy 类就无法启动延迟加载。这是一个类似问题的问题:stackoverflow.com/questions/4090609/…
  • @Manuel?你是怎么解决问题的?还有关于DoctrineCollection的问题stackoverflow.com/questions/31971637/…
  • 感谢您的回答!我使用 Symfony 已经 3 年了,我不明白为什么有时我的关联是空的……使用 Twig 中的“get”函数解决了我的问题。例如,我写的不是{{ product.type.name }},而是{{ product.getType.name }}
【解决方案3】:
//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 相同 没有它,它在我的数据库中什么也做不了

【讨论】:

    【解决方案4】:

    务必在 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;
    

    【讨论】:

    • 感谢您的回答。但这并没有解决我的问题:(。我忘记发布 orgGroupType-Class 的代码,但它像您发布的那样实现。我将丢失的代码附加到我的第一篇文章中。您还有其他想法:-)?跨度>
    • 从数据库中检索对象时不会调用__construct
    • 好的。一个问题是,我的 WebService 函数没有将数据正确打包到我的 json 对象中。当我不访问 orgGroupType 对象时,它不会被初始化。但是在我访问它一次之后,我可以轻松地将它打包......但是描述属性的另一个问题仍然没有解决。它只是一个字符串,我只是从 entityManager 获得“null”。在数据库中我的对象看起来像: id:1 名称:AdministratorGroup 描述:一些描述 _orgGroupType:1 但 entityManager 给了我:id:1 名称:AdministratorGroup 描述:null _orgGroupType:1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多