2

Symfony2 では、フラッシュする前に $form->bind() を使用して古いものと新しいものを比較する前に、エンティティを保存する必要があります。

私はいくつかの機能を試しました:

$command = $repository->findCommandProductsByCommand( $id );
$old_command = clone $command;
// OR $old_command = $command;
$form = $this->createForm(new EditCommandType(), $command);

if( $request->getMethod() == 'POST' )
{
    $form->bind($request);
    if ( $form->isValid() )
    {

そして、次のようにエンティティの一部を保存しようとしました:

$old_command = $command->getCommandProducts();

しかし、これらのメソッドのいずれかで $old_command のデータにアクセスしようとすると、フォームからオブジェクトの新しい値にしかアクセスできず、古い値にはアクセスできません。

$form->bind($request) が主な問題ですが、bind() が正確に何をするかを説明しているドキュメントは見つかりませんでした。

よろしくお願いします

私の場合の解決策(zizoujabに感謝)

$command_entries = new ArrayCollection();
foreach ($command->getCommandproducts() as $entry) {
    $command_entries[] = clone $entry;
}

今私の ArrayCollection $command_entries は前のエンティティにリンクしていません。

4

1 に答える 1

3

クローンマニュアルから:

オブジェクトが複製されると、PHP 5 はオブジェクトのすべての
プロパティの浅いコピーを実行します。他の変数への参照であるすべてのプロパティは、参照のままになります。

getCommandProducts()を返すと仮定しているArrayCollectionので、常に新しいリストを取得できます。

リストの要素も複製する必要があります。

ここに完全な説明とソリューションのサンプルがあります: Symfony2/Doctrine: How to re-save an entity with a OneToMany as a cascading new row

于 2013-06-04T21:19:27.087 に答える