1

サンプルモデル:

/** @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 から取得しない属性から元の値を保持することができます。

4

1 に答える 1