29

我是 Symfony2(或 Symfony3)的新手,我找不到如何设置学说(带有注释配置)以在“创建”或“修改”字段时自动将其保存在我的实体中。

4

5 回答 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任何东西。只需创建gettersetter属性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语句(这意味着重复您的属性名称)并在构造函数中使用可能永远不会使用的属性设置逻辑。

或者,您可以拥有在需要时调用onAddonUpdate方法:

/**
 * @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 回答