Doctrine2 ORM - 托管+脏实体 X 无法安排插入

问题描述 投票:0回答:2

我有以下课程(仅显示部分内容以减少阅读量)

class Page {
    /**
     * @ORM\Column(type="string", unique=true, nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="UUID")
     * @var string
     */
    protected $id;
    /**
     * @ORM\OneToMany(targetEntity="Url", mappedBy="content")
     * @var Url[]
     */
    protected $urls;

    public function __construct()
    {
        $this->urls = new ArrayCollection();
    }
}

并且:

class Url
{
    /**
     * @ORM\Id @ORM\Column(type="string", unique=true, nullable=false)
     * @ORM\GeneratedValue(strategy="UUID")
     * @var string The unique identifier for the Url
     */
    protected $id;
    /**
     * @ORM\ManyToOne(targetEntity="Page", inversedBy="urls", cascade={"persist", "merge"})
     * @ORM\JoinColumn(name="content_id", referencedColumnName="id")
     * @var int The UUID of the content
     */
    protected $content;

    public function __construct(Page $content, $link)
    {
        $this->content = $content;
        $this->content->addUrl($this);
    }
}

每个都有一个带有

save()
函数的管理器类,该函数仅使用
persist()
flush()
。然后保存它们:

$pageManager->save($post);
$url = new Url($post, 'link goes here');
$urlManager->save($url);

我也尝试过:

$url = new Url($post, 'link goes here');
$pageManager->save($post);
$urlManager->save($url);

尽管在这两种情况下我都得到:

( ! ) 致命错误:未捕获的异常“Doctrine\ORM\ORMInvalidArgumentException”,消息为“无法安排插入托管+脏实体 Page@000000003d5a4ca10000000133ba3c3e。”

我已经尝试过使用和不使用

AnnotationReader
EntityManager::create()

一起使用

Doctrine 的模式验证器也不会报告任何错误:

php vendor/bin/doctrine orm:validate-schema
[Mapping]  OK - The mapping files are correct.
[Database] OK - The database schema is in sync with the mapping files.

有什么想法可以让

persist()
发挥作用吗?

php orm doctrine-orm
2个回答
0
投票

弄清楚了:

我必须颠倒它们保存的顺序,因此先保存

Url
,然后保存
Page
(尽管这样做会带来另一个问题,我需要解决它想要持久保存作者实体但可以't(它认为它是新的,但事实并非如此)。以为可能是分离的,但即使是
merge()
也无法解决它。

/**
 * @ORM\ManyToOne(targetEntity="User")
 * @ORM\JoinColumn(name="author_id", referencedColumnName="id")
 * @var string The UUID of the author for the {@link Page}
 */
protected $author;

0
投票

您必须在

$post
之前保留
$url
flush()
对象。否则你将会收到此错误消息。

尝试这样做...

$entityManager->persist($post);
$url = new Url($post, 'link goes here');
$entityManager->persist($url);
$entityManager->flush();

或者您可以在管理器上创建一个标志参数,如果为 false 则不刷新...

$flush = false;
$pageManager->save($post, $flush);
$url = new Url($post, 'link goes here');
$urlManager->save($url);

它可能无需任何额外资源即可工作。

© www.soinside.com 2019 - 2024. All rights reserved.