- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个表单,可以让我保存或复制记录。该表单将记录保存为 $view
实体,该实体恰好有多个关联实体,例如$viewVersion
由表单构建器在具有嵌套实体的 formType 中管理(这可能是不相关的)。
如果我进行更改并将表单提交为“复制”,则代码将使用实体上的函数克隆 $view
对象,该函数会取消设置 $view->id
和其他协会。这会迫使 Doctrine 在将记录保存到数据库时创建新记录。这非常有效。万岁!
但是,对记录所做的更改也会保留到克隆的原始实体(并因此保存到数据库)。因此它将这些更改保存到两个数据库记录中。我碰巧喜欢这个功能,但我需要了解它为什么这样做,这样以后就不会中断。以下是相关代码的摘要:
// File: CmsBundle/Controller/AdminEditController.php
// Get the Entity Manager
$em = $this->getDoctrine()->getManager();
// Get the View based on the requested ID
// Is there some magic that happens here to make the entity manager track this $view entity?
$view = $em->getRepository("GutensiteCmsBundle:View\View")->find($request->query->get('id'));
// Various bits of code to do whatever I want before a save
// ...
if ($request->isMethod( 'POST' )) {
$form->handleRequest($request);
if( $form->isValid() ) {
// Duplicate the view entity if the view button is pushed
if(
$form->has('duplicate')
&& $form->get('duplicate')->isClicked()
) {
$view = clone $view;
}
// Persist the cloned view
$em->persist($view);
$em->flush();
}
}
View 实体有一个特殊的克隆函数,可以在克隆时触发,从而重置克隆版本的 ID:
// File: CmsBundle/Entity/View.php
public function __clone() {
if($this->id) {
$this->setId(null);
$this->setLockVersion(1);
$this->setPublished(null);
// Clone associated entities and reassociate with THIS version (even though there is no id yet, there will be when it persists)
// clone the current version (which also has a clone function like this)
$version = clone $this->getVersion();
// reset the viewid with a custom function
$version->resetView();
// Add this cloned verion to the version history
$this->addVersion($version);
}
我读过很多有关克隆的文章,并且一直有人告诉我,您不需要 detach来自实体管理器的原始 $view
。另外,我也尝试过,但并没有什么效果。对 $view 的更改(在克隆之前由表单提交并处理到 $view)仍然保存到原始 $view
记录 ID(例如 33)以及新的记录 ID 中。克隆记录(例如 62)。因此,尽管在单个实体上只调用了一个持久化,但还是发生了两个持久化。
这是怎么回事?
有人告诉我,如果您使用实体管理器加载实体,实体管理器就会跟踪它。因此,如果您在任何时候调用 flush()
,任何更改都将被持久化,即使您没有对实体调用 persist($view)
也是如此。因此,当我克隆实体时,实体管理器有效地管理 2 个实体:原始实体和克隆实体。
我尝试通过两种方式在克隆之前将 View 与实体管理器分离:
// detach method 1
$em->detach($view);
$em->flush();
// detach method 2
$em->refresh($view);
$em->flush();
// clone the view after detaching the first entity.
$view = clone $view;
但是实体管理器仍然保留对原始 $view
记录的更改。
我还尝试了将 unset($this->_entityPersister, $this->_identifier);
添加到我的自定义 __clone()
方法的建议。但这也没有将原始实体或克隆版本与实体管理器分离。更改已保存到旧记录和新记录中。
似乎没有什么能让实体管理器忽略原始实体。
最佳答案
仅当您将某些内容附加到 Entity Manager
时才需要
Persist
。但在你的情况下,原始的“$view
record id (e.g. 33)”已经在其中了。基本上,会发生什么:
$view1 = new View();
$view1->text = '1';
$em->persist($view1);
$em->flush();
现在您已经存储了一条文本 == '1' 的记录。然后:
$view1->text = 'one'; //important!
$view2 = new View();
$view2->text = 'two';
$view3 = new View();
$view3->text = 'three';
$em->persist($view2);
$em->flush();
调用flush()
更新您的$view1
,插入您的$view2
,并忽略您的 $view3
自上次以来未保留。因此,您有两条记录“一”和“二”。
可以为选定的对象调用flush()
。因此,调用 $em->flush($view2)
只会插入 $view2
并保持 $view1
不变。
在你的简单示例中它会起作用。
但请确保 $em->flush()
不会再发生。
否则,要确保您的 $view1
保持不变,请尝试$em->refresh($view1)
它。
关于php - 在 Symfony2 中克隆实体在通过 Doctrine 持久保存时会保存对原始记录和克隆记录的更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24708733/
我有一个网站。 必须登录才能看到里面的内容。 但是,我使用此代码登录。 doc = Jsoup.connect("http://46.137.207.181/Account/Login.aspx")
我正在尝试为我的域创建一个 SPF 记录并使我的邮件服务器能够对其进行评估。我在邮件服务器上使用 Postfix 并使用 policyd-spf (Python) 来评估记录。目前,我通过我的私有(p
我需要为负载平衡的 AWS 站点 mywebsite.com 添加 CName 记录。记录应该是: @ CNAME mywebsite.us-east-1.elb.amazon
我目前正在开发一个相当大的多层应用程序,该应用程序将部署在海外。虽然我希望它在解聚后不会折叠或爆炸,但我不能 100% 确定这一点。因此,如果我知道我可以请求日志文件,以准确找出问题所在以及原因,那就
我使用以下命令从我的网络摄像头录制音频和视频 gst-launch-0.10 v4l2src ! video/x-raw-yuv,width=640,height=480,framerate=30/1
我刚刚开始使用 ffmpeg 将视频分割成图像。我想知道是否可以将控制台输出信息保存到日志文件中。我试过“-v 10”参数,也试过“-loglevel”参数。我在另一个 SO 帖子上看到使用 ffmp
我想针对两个日期查询我的表并检索其中的记录。 我这样声明我的变量; DECLARE @StartDate datetime; DECLARE @EndDate datetime; 并像这样设置我的变量
在 javascript 中,我可以使用简单的 for 循环访问对象的每个属性,如下所示 var myObj = {x:1, y:2}; var i, sum=0; for(i in myObj) s
最近加入了一个需要处理大量代码的项目,我想开始记录和可视化调用图的一些流程,让我更好地理解一切是如何组合在一起的。这是我希望在我的理想工具中看到的: 每个节点都是一个函数/方法 如果一个函数可以调用另
如何使用反射在F#中创建记录类型?谢谢 最佳答案 您可以使用 FSharpValue.MakeRecord [MSDN]创建一个记录实例,但是我认为F#中没有任何定义记录类型的东西。但是,记录会编译为
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 3年前关闭。 Improve thi
我是 Sequelize 的新手并且遇到了一些语法问题。我制作了以下模型: // User sequelize.define('user', { name: { type: DataTyp
${student.name} Notify 这是我的output.jsp。请注意,我已经放置了一个链接“Notify”以将其转发到 display.jsp 上。但我不确定如何将 Stud
例如,这是我要做的查询: server:"xxx.xxx.com" AND request_url:"/xxx/xxx/xxx" AND http_X_Forwarded_Proto:(https O
我一直在开发大量 Java、PHP 和 Python。所有这些都提供了很棒的日志记录包(分别是 Log4J、Log 或logging)。这在调试应用程序时有很大帮助。特别是当应用程序 headless
在我的Grails应用程序中,我异步运行一些批处理过程,并希望该过程记录各种状态消息,以便管理员以后可以检查它们。 我考虑过将log4j JDBC附加程序用作最简单的解决方案,但是据我所知,它不使用D
我想将进入 MQ 队列的消息记录到数据库/文件或其他日志队列,并且我无法修改现有代码。是否有任何方法可以实现某种类似于 HTTP 嗅探器的消息记录实用程序?或者也许 MQ 有一些内置的功能来记录消息?
如果我有一条包含通用字段的记录,在更改通用字段时是否有任何方法可以模仿方便的 with 语法? 即如果我有 type User = // 'photo can be Bitmap or Url {
假设我有一个名为 Car 的自定义对象。其中的所有字段都是私有(private)的。 public class Car { private String mName; private
当记录具有特定字段时,我需要返回 true 的函数,反之亦然。示例: -record(robot, {name, type=industrial, ho
我是一名优秀的程序员,十分优秀!