我使用Symfony 3.
我有一个可以创建和编辑的实体(书)。所以我创建了两个动作和表单来执行此操作。但是,我想保存这一变化的历史。
我想象一个解决方案。两个Entity,Book和SubBook继承BaseBook。 SubBook是Book的所有编辑历史,并由字段“parent”链接。
public function editAction(Request $request, ...)
{
$book = ...
$form = $this->createForm(BookType::class, $book);
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
$subbook = new SubBook($book);
$em = $this->getDoctrine()->getManager();
$em->persist($subbook);
$em->flush();
// ...
}
// ...
}
的appbundle /实体/预订
class Book extends BaseBook {
// ...
}
的appbundle /实体/ SubBook
class SubBook extends BaseBook {
// ...
public function __construct($book)
{
parent::__construct();
// ...
$this->parent = $book;
}
}
的appbundle /型号/ BaseBook
abstract class BaseBook
{
// ...
}
但我的问题是,当我提交编辑表单时,我的书($book
)会在我执行$em->flush();
时自动保留,因此即使我不执行$em->persist($book);
它也会更新}。
那么,你有任何想法吗?或者解决这个错误?
谢谢!
答案 0 :(得分:1)
您应该使用$em->detach($book);
。您可以在documentation
答案 1 :(得分:0)
所以,我终于这样做了。我的Book
是具有上次更新的实体,我在SubBook
实体中保存了所有已更改的值。
我的SubBook
实体几乎就像Book
,但所有值(未更改)都可以是null
。所以我放弃了这个模型。
public function editAction(Request $request, $id)
{
$book = ...
$form = ...
if ($form->isSubmitted() && $form->isValid()) {
$em = $this->getDoctrine()->getManager();
$uow = $em->getUnitOfWork();
$uow->computeChangeSets();
$changeset = $uow->getEntityChangeSet($book);
$subbook = new SubBook($book, $changeset);
$em->persist($subbook);
$em->persist($book);
$em->flush();
// ...
}
// ...
}
的appbundle /实体/ SubBook
public function __construct($book, $changeset)
{
// ...
$this->parent = $book;
foreach ($changeset as $key => $values) {
$this->$key = $values[0]; // values[0] => Hold value, [1] => New value
}
}