サンプルモデル:
/** @Entity */
class Person{
/**
* @Id @Column(type="integer", nullable=false)
* @GeneratedValue(strategy="AUTO")
*/
protected $id;
/** @Column */
protected $name;
/** @Column(type="datetime") */
protected $created_at;
//setters and getters...
public function __construct($std){
$this->id = $std->id;
$this->nome = $std->nome;
$this->created_at = new DateTime;
}
}
クライアント/サーバー間の通信にjsonを使用しています。クライアントからjsonを取得する必要があります
{ "id": 123, "name": "john" }
フィールド「created_at」を変更せずに保持します。次のようにします。
$p = json_decode($string);
$person = new Person($p);
entity_manager->merge($person);
entity_manager->flush();
この場合、オブジェクトは正常に更新されますが、明らかに、「created_at」フィールドには「new DateTime」からの新しい値が設定されます。DB からマネージド エンティティを取得し、「名前」を変更することもできますが、不要な Select は必要ありません。
一言で言えば、次のようなことを実行するにはどうすればよいですか。
UPDATE Person set name = "john" where id = 123
更新時にプロパティを無視する注釈はありますか? プロパティを未変更として設定する方法はありますか?
編集
SqlLogger を使用していくつかのテストを行った後、merge() メソッドが SELECT を実行して現在の状態を取得していることに気付きました...したがって、現時点での私の解決策は、自分でオブジェクトを取得し、更新したい値のみを置き換えることです。 . 何かのようなもの:
$std = json_decode($string);
$p = entity_manager->find('Person', $std->id);
$p->name = $std->name;
entity_managet->flush();
このようにして、「選択」の数は同じですが、json から取得しない属性から元の値を保持することができます。