Symfony表单编辑

时间:2017-01-24 00:25:04

标签: php forms doctrine symfony

我使用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);它也会更新}。

那么,你有任何想法吗?或者解决这个错误?

谢谢!

2 个答案:

答案 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
    }
}