我是 Symfony2(或 Symfony3)的新手,我找不到如何设置学说(带有注释配置)以在“创建”或“修改”字段时自动将其保存在我的实体中。
user1270589
问问题
27907 次
5 回答
44
在此之后我的解决方案...
您只需要将其直接放入您的实体类中:
/**
* @ORM\Entity
* @ORM\HasLifecycleCallbacks
*/
class MyEntity {
//....
public function __construct() {
// we set up "created"+"modified"
$this->setCreated(new \DateTime());
if ($this->getModified() == null) {
$this->setModified(new \DateTime());
}
}
/**
* @ORM\PrePersist()
* @ORM\PreUpdate()
*/
public function updateModifiedDatetime() {
// update the modified time
$this->setModified(new \DateTime());
}
//....
}
它实际上运作良好
于 2014-09-28T05:34:43.350 回答
26
您可以使用StofDoctrineExtensionsBundle。这在symfony 食谱中有描述。它包含时间戳行为。
/**
* @var datetime $created
*
* @Gedmo\Timestampable(on="create")
* @ORM\Column(type="datetime")
*/
private $created;
/**
* @var datetime $updated
*
* @Gedmo\Timestampable(on="update")
* @ORM\Column(type="datetime")
*/
private $updated;
于 2013-08-16T05:51:01.177 回答
10
/**
*
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function updatedTimestamps()
{
$this->setModifiedAt(new \DateTime(date('Y-m-d H:i:s')));
if($this->getCreatedAt() == null)
{
$this->setCreatedAt(new \DateTime(date('Y-m-d H:i:s')));
}
}
你不需要调用__constructor
任何东西。只需创建getter
和setter
属性created
,仅modified
此而已。
如果您setCreated()
在每次更新时首先设置,您还将更新created
列。所以先放setModifedAt()
于 2016-10-03T12:57:08.083 回答
5
另外两个示例(如果您使用的是 Yaml 或 Xml 映射):
Entity\Product:
type: entity
table: products
id:
id:
type: integer
generator:
strategy: AUTO
fields:
name:
type: string
length: 32
created_at:
type: date
gedmo:
timestampable:
on: create
updated_at:
type: datetime
gedmo:
timestampable:
on: update
和xml:
<?xml version="1.0" encoding="UTF-8"?>
<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
xmlns:gedmo="http://gediminasm.org/schemas/orm/doctrine-extensions-mapping">
<entity name="Mapping\Fixture\Xml\Timestampable" table="timestampables">
<id name="id" type="integer" column="id">
<generator strategy="AUTO"/>
</id>
<field name="created_at" type="datetime">
<gedmo:timestampable on="create"/>
</field>
<field name="updated_at" type="datetime">
<gedmo:timestampable on="update"/>
</field>
</entity>
</doctrine-mapping>
于 2013-08-16T06:50:17.970 回答
3
其他答案建议使用if
语句(这意味着重复您的属性名称)并在构造函数中使用可能永远不会使用的属性设置逻辑。
或者,您可以拥有在需要时调用onAdd
的onUpdate
方法:
/**
* @ORM\PrePersist
*/
public function onAdd()
{
$this->setAdded(new DateTime('now'));
}
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
public function onUpdate()
{
$this->setUpdated(new DateTime('now'));
}
于 2017-07-30T11:47:22.980 回答