Подтвердить что ты не робот

Symfony → Как создать созданные и модифицированные поля с помощью Doctrine?

Я новичок в Symfony2 (или Symfony3), и я не могу найти, как установить доктрину (с конфигурацией аннотаций), чтобы автоматически сохранять ее в моих сущностях при создании или изменении полей.

4b9b3361

Ответ 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'));
}