如何更新postUpdate上的字段?

时间:2014-07-21 09:35:48

标签: php symfony doctrine-orm

我有一个实体监听器,如果用户更改了记录,则将updatedAt字段设置为当前时间。

然而现在需求已经改变,我需要运行一个脚本并立即更新所有实体,但不应该弄乱用户生成的updatedAt-field。

所以我想构建一个更新所有实体的命令,但不应更新updatedAt-field。

我想知道如何通过这样的参数。

目前我想知道是否应该在实体上添加doUpdateUpdatedAt字段,并且对于命令将其设置为false。但我想知道是否有不同的方式。我认为如果设置updatedAt-field,资产不应该被关注,我认为这应该在我持久化实体或刷新时发生。

我希望对有什么可能性以及它们的优缺点有一些反馈。

1 个答案:

答案 0 :(得分:0)

侦听器已注册为服务,这意味着可以通过容器轻松地在命令中访问它并设置所需的属性:

class UpdateAssetCategoryCountCommand extends AbstractCommand
{
    ...

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $assets = $this->findAllAssets();
        $em = $this->getEntityManager();

        $listener = $this->getContainer()->get('my.listener');
        $listener->doNotUpdateTimeStamp();

        foreach ($assets as $asset) {
            // change the required fields
            $em->persist($asset);
        }

        $em->flush();
    }

在我的听众中:

class MyListener implements EventSubscriber
{
    /**
     * @var bool
     */
    private $shouldUpdateTimestamp = true;

    ...

    public function preUpdate(LifecycleEventArgs $arg)
    {
        $entity = $arg->getObject();
        $em = $arg->getEntityManager();

        if ($entity instanceof Asset) {
            $entity->updateCategoryCount();
            $entity->preUploadHandlerIfFileUploaded();

            if ($this->shouldUpdateTimestamp) {
                $entity->setUpdatedAt(new DateTime('now'));
            }

            $this->persistChanges($em, $entity);
        }

    public function doNotUpdateTimeStamp()
    {
        $this->shouldUpdateTimestamp = false;
    }


}