更新存储库中的字段

Updating field inside a repository

我正在我的 Symfony 4 应用程序(命令)中创建一个 CRON 来存档超过 60 天的新闻。应该怎么做?

我的第一直觉是在我的 NewsRepository 中添加一个方法来检索所有需要存档的新闻,并在需要时将他们的 isArchived 布尔方法从 false 更新为 true。

然后,我想到了在存储库中添加用于归档新闻的逻辑,以便它可以在 Command 之外使用。我还可以将逻辑(MySQL 更新)放在命令中,并且只在存储库中包含“'find'”查询。

以下哪种方法更可取,为什么?我的存储库方法应该是 findNewsToArchive 并在命令中执行更新逻辑,还是应该是 archiveAllNewsThatNeedsToBeArchived 并在存储库中执行所有逻辑?

在你的命令中使用你的所有逻辑对你的情况来说是一种不好的做法,你在技术上有两个独立的东西 find/archive,如果我是你,我将使用我的存储库和两个函数 findNews(array $criteria): arrayarchive(array $news): void

一个会根据您的条件(60 天...)查找新闻,另一个功能会将它们存档。并且您可以随心所欲地重复使用它们,并且易于维护。您的命令将仅使用这两个函数来根据您的条件查找和归档

如果您需要做的只是更新 isArchived-flag,则您不需要获取任何实体。相反,您可以直接发出 UPDATE-query,例如像这样:

class NewsRepository extends ServiceEntityRepository
{
    // ...

    public function archiveOldNews(\DateTimeImmutable $olderThan): void
    {
        $dql = 'UPDATE App\Entity\News news SET news.isArchived = true WHERE news.createdOn < :older';

        $updateQuery = $this->getEntityManager()->createQuery($dql);
        $updateQuery->setParameter('older', $olderThan);
        $updateQuery->execute();
    }
}

这将直接更新数据库中的所有条目,使操作既原子又快速。在某些情况下,这可能会阻止在获取、更改 PHP 中的所有内容然后将数据提交回数据库之间更改数据的问题。