2013-07-23 12 views
6

関連付けられたDoctrine Entityにjson文字列を正常にデシリアライズした後。永続すると、Doctrineはこれらの関連付けを常に新しいエンティティとして検出します。どのようにしてIDだけで関連付けを更新し、変更があれば関連するエンティティ値を変更しないのですか?JMSSerializerを使用して非直列化された関連付けを持つDoctrineエンティティ

私のケース:

静的なデータを持つデータベーステーブルがあります。最も簡単なのはユニットを格納するためのものです。 (私はユニットと呼ばれる教義の実体を持っています)。表には、このようなものです:

|id|name |ratio | 
|1 |mgr |1  | 
|2 |gr |1000 | 
|3 |Kgr |1000000| 

そして、ユーザはまた、ユニットと呼ばれるサーバー側の教義エンティティを持っている項目を、作成することができます。私は、クライアント側のBACKBONE.JSモデルを使用して更新する場合、このように私のSymfony2のアプリに送信されています:今

//Item object to be serialized into Item entity 
{ 
    id: 13141 
    weight: 100 
    unit: { 
     id:1 
     name:mgr 
     ratio:1 
    } 
    //many more attributes here 
} 

が、私はJMSSerializerとデシリアライズ、すべてが大丈夫ですが、私は教義が唯一のユニットIDを更新したいです関係、およびユニット全体ではありません。

ドクトリンは、「新しいユニットエンティティ」(私が望むものではない)を見つけたと教えてくれると教えて、ドクトリンエンティティでカスケードをpersistに設定するよう伝えます。 これを実行して誰かがユニットjsonを変更した場合、静的なUnitsテーブルは変更されませんか?例えば

:私は確かにこれが起こることを望んでいない

//BAD item object to be serialized into Item entity 
{ 
    id: 13141 
    weight: 100 
    unit: { 
     id:1 
     name:BadName //Will this get persisted to the database? 
     ratio:1 
    } 
    //many more attributes here 
} 

:バッドユーザーはこれを送信することにより、JSONを変更します。 id:1のユニットをアイテムに追加したいだけです。

このケースは単純ですが、IDでユニットをフェッチしてエンティティに設定することはできますが、実際のアプリケーションではItemエンティティが非常に大きいので、これを自動的に処理したいと考えています。

¿任意のアイデアは?

を使用すると、ユニット部材の種類が何であるかテキストをデシリアライズする場合:

答えて

4

は私がまっすぐにこれを取得してみましょうか?それはarrayclassインスタンスですか?私が正しく理解し、それがclassインスタンスである場合は、あなたが行うことができますので、あなたがunit財産上mergecascade(ないpersist)を設定することができ

$em = ...; // your entity manager 
$item = $em->merge($item); // merge will cascade to `unit` property as well 

は、この情報がお役に立てば幸いです...

関連する問題