【问题标题】:Argument 1 passed to Doctrine\ORM\UnitOfWork::getCollectionPersister() must be an array, null given传递给 Doctrine\ORM\UnitOfWork::getCollectionPersister() 的参数 1 必须是一个数组,给定 null
【发布时间】:2013-01-07 20:04:19
【问题描述】:

我的实体如下所示(仅粘贴相关部分):

用户.php

    /**
     * @ManyToMany(targetEntity="Startup", inversedBy="members", cascade={"persist"})
     * @OrderBy({"name"="ASC"})
     * @var Startup[]
     */
    private $startups;

    public function __construct($data = array()) 
    {
        $this->startups = new ArrayCollection();
        $this->joined = new DateTime("now");
        parent::__construct($data);
    }

启动.php

    /**
     * @ManyToOne(targetEntity="User", cascade={"persist"})
     * @var User
     */
    private $founder = null;

    /**
     * @ManyToMany(targetEntity="User", mappedBy="startups", cascade={"persist"})
     * @OrderBy({"lastName" = "ASC"})
     * @var User[]
     */
    private $members;

    public function __construct($data = array())
    {
        $this->files = new ArrayCollection();
        $this->topics = new ArrayCollection();
        $this->members = new ArrayCollection();

        $this->founded = new DateTime("now");

        parent::__construct($data);
    }

现在我正在运行这段代码($this->identity instanceof User,$values 只是一些用字符串填充的结构,$this->model 是 EntityManager):

          $startup = new Startup();
          $startup->name = $values->name;
          $startup->founder = $this->identity;
          $this->model->persist($startup);
          $this->identity->startups[] = $startup;
          $this->model->flush();

我明白了:

参数 1 传递给 Doctrine\ORM\UnitOfWork::getCollectionPersister() 必须是一个数组,给定null,调用 .../libs/Doctrine/ORM/UnitOfWork.php 在第 332 行并定义

显然是在刷新时触发的。我做错了什么?

【问题讨论】:

  • 您是否尝试过在构造函数中使用$data = array() 而不是$data = null
  • 那不是问题,我已经解决了,我已经从帖子中删除了它以使其更清楚。 if($data == null) $data = array(); 在我使用 $data 之前。但这实际上是个好点,我不知道为什么我使用null作为默认值。
  • 您是否能够:1. 提供更好的堆栈跟踪(完成一个,最终使用传入的参数) 2. 告诉我们为什么您的模型具有持久性方法?
  • 调用堆栈现在有问题了。 Model 只是帮助器类,可以更轻松地访问存储库和 EM 核心方法。
  • @ZdeněkTopič 您现在可以尝试运行模式工具验证吗?这是一个 CLI 工具。不确定它是否与 Nette 集成。

标签: php doctrine doctrine-orm


【解决方案1】:

已修复。 $this->identity 是个问题。框架将其序列化,然后反序列化。

【讨论】:

  • 它可能在做一些奇怪的序列化/反序列化/克隆魔法:)
  • 我想我知道发生了什么,这都是我的错。我忘记了它仅在第一次记录 id 时直接从 EM 加载。下一次它可能只是来自会话或其他存储的序列化/非序列化对象。我是个白痴,我会自动在每个请求上坚持它,以按照我的意思继续使用它。
  • 这就清除了 :) 记住不要序列化你的实体,这只是你喝的液体疼痛。
猜你喜欢
  • 2021-12-06
  • 2020-01-06
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
  • 1970-01-01
相关资源
最近更新 更多