样品型号:
/** @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”中的新值。我可以从数据库中获取一个托管实体,然后只更改“名称”,但我不想要不必要的 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 获得的属性的原始值。