样本模型:
/** @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”中的新值设置的。 我可以从数据库中获取一个托管实体,然后只需更改“名称”,但我不想要不必要的选择..
简而言之,我该如何执行以下操作:
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无法获得的属性。
答案 0 :(得分:0)
Doctrine需要一个持久化实体才能定义哪个字段已更新。
http://apigen.juzna.cz/doc/doctrine/doctrine2.git/source-class-Doctrine.ORM.UnitOfWork.html#607-623
如果您的问题只是关于DateTime,您可以使用“Column”注释的“columnDefinition”部分来处理您的create_at值。
http://docs.doctrine-project.org/en/2.0.x/reference/annotations-reference.html#annref-column
例如使用mysql:
/** @Column(type="datetime", columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP") */
protected $created_at;
//setters and getters...
public function __construct($std){
$this->id = $std->id;
$this->nome = $std->nome;
//And so remove this initialization
//$this->created_at = new DateTime;
}