gpt4 book ai didi

symfony - 如何禁用带有注释的 Doctrine 持久级联?

转载 作者:行者123 更新时间:2023-12-02 13:16:45 25 4
gpt4 key购买 nike

考虑如下两个类:

/**
* @ORM\Table(name="notifications")
*/
class Notification {

/**
* @var integer
*
* @ORM\Column(name="uid", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;

/**
* @ORM\ManyToOne(targetEntity="Task")
* @ORM\JoinColumn(name="task_id", referencedColumnName="id", onDelete="CASCADE")
*/
private $task;

}


/**
* @ORM\Table(name="tasks")
*/
class Task {

/**
* @var integer
*
* @ORM\Column(name="uid", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;

/**
* @var integer
*
* @ORM\Column(name="status", type="smallint")
*/
private $status;

}

在我的 Controller 中我有

$task = $em->getRepository("AppBundle:Task")->find(1);
$task->setStatus(1);

$notification = new Notification();
$notification->setTask($task);

$em->persist($notification);
$em->flush();

我的问题是当我坚持$notification时如何避免坚持task?使用上面的代码,它还将 task 状态更改为 1。

我知道我可以做类似下面的事情,但我想知道是否可以通过注释来做到这一点?

$em->flush($notification);

为什么 Doctrine 坚持 ManyToOne 的另一面?

最佳答案

持久级联与此无关。例如,这仍然会更新任务:

$task = $em->getRepository("AppBundle:Task")->find(1);
$task->setStatus(1);
$em->flush();

一个常见的误解是,持久化实体意味着它以某种方式标记为准备更新,但事实并非如此。

Persisting an entity意味着该实体现在由实体管理器管理。

对任何托管实体的更改都将在刷新时提交,如果实体已被托管,则持久不会更改。

对于您的任务对象,您已经使用实体管理器获取了它,因此它被视为托管,并且您对其所做的任何更新都将在刷新时提交,无论您是否对其调用持久化。

总之,如果您不希望通过全局刷新更新托管实体,则不要更新它们,或者仅对您特别想要保存到数据库的实体调用 ->flush。

更多信息:

https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/working-with-objects.html#synchronization-with-the-database

关于symfony - 如何禁用带有注释的 Doctrine 持久级联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37055926/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com