Я новичок в Symfony2 (или Symfony3), и я не могу найти, как установить доктрину (с конфигурацией аннотаций), чтобы автоматически сохранять ее в моих сущностях при создании или изменении полей.
Symfony → Как создать созданные и модифицированные поля с помощью Doctrine?
Ответ 1
/**
*
* @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
colum. Поэтому поставьте сначала setModifedAt()
Ответ 2
Здесь мое решение после этого времени...
Вам просто нужно поместить это прямо в свой класс сущностей:
/**
* @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());
}
//....
}
Хорошо работает на самом деле
Ответ 3
Вы можете использовать StofDoctrineExtensionsBundle. Это описано в кулинарной книге Symfony. Он содержит Timestampable поведение.
/**
* @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;
Ответ 4
Еще два примера (если вы используете сопоставление Ямл или 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>
Ответ 5
Другие ответы предполагают использование операторов 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'));
}