【问题标题】:Symfony form editSymfony 表单编辑
【发布时间】:2017-01-24 00:25:03
【问题描述】:

我使用 Symfony 3。

我有一个可以创建和编辑的实体(书)。所以我创建了两个动作和表单来做到这一点。但是,我想保存此更改的历史记录。

我想出了一个解决方案。 BaseBook 继承的两个实体,Book 和 SubBook。 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/实体/子书

class SubBook extends BaseBook {
    // ...
    public function __construct($book)
    {
        parent::__construct();
        // ...
        $this->parent = $book;
    }
}

AppBundle/Model/BaseBook

abstract class BaseBook
{
    // ...
}

但我的问题是,当我提交编辑表单时,我的 Book ($book) 在我执行 $em->flush(); 时会自动保留,因此即使我不执行 $em->persist($book);,它也会更新。

那么,你有什么想法吗?还是解决这个错误?

谢谢!

【问题讨论】:

  • $em->detach($book);
  • @goto 谢谢,但提问者没有回应,没有解释的单行字也不是什么答案。随意写下你自己的答案,也许添加一些细节。
  • @Cerad meta.stackoverflow.com/questions/266954/one-line-answers - 编辑:哎呀,没看到你是 25k 用户 xD

标签: php forms doctrine symfony


【解决方案1】:

您应该使用$em->detach($book);。您可以在documentation中找到更多信息

【讨论】:

  • Hugo 的回答就是为什么我不喜欢花时间为这类问题写详细的答案。谁知道他们真正想要什么。
【解决方案2】:

所以,我终于做到了。我的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/实体/子书

public function __construct($book, $changeset)
{
    // ...
    $this->parent = $book;
    foreach ($changeset as $key => $values) {
        $this->$key = $values[0]; // values[0] => Hold value, [1] => New value
    }
}

【讨论】:

    猜你喜欢
    • 2014-06-08
    • 2017-12-20
    • 2015-09-05
    • 2014-12-25
    • 2017-06-26
    • 2020-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多