更新存储库中的字段
Updating field inside a repository
我正在我的 Symfony 4 应用程序(命令)中创建一个 CRON 来存档超过 60 天的新闻。应该怎么做?
我的第一直觉是在我的 NewsRepository
中添加一个方法来检索所有需要存档的新闻,并在需要时将他们的 isArchived
布尔方法从 false 更新为 true。
然后,我想到了在存储库中添加用于归档新闻的逻辑,以便它可以在 Command 之外使用。我还可以将逻辑(MySQL 更新)放在命令中,并且只在存储库中包含“'find'”查询。
以下哪种方法更可取,为什么?我的存储库方法应该是 findNewsToArchive
并在命令中执行更新逻辑,还是应该是 archiveAllNewsThatNeedsToBeArchived
并在存储库中执行所有逻辑?
在你的命令中使用你的所有逻辑对你的情况来说是一种不好的做法,你在技术上有两个独立的东西 find/archive,如果我是你,我将使用我的存储库和两个函数 findNews(array $criteria): array
, archive(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 中的所有内容然后将数据提交回数据库之间更改数据的问题。
我正在我的 Symfony 4 应用程序(命令)中创建一个 CRON 来存档超过 60 天的新闻。应该怎么做?
我的第一直觉是在我的 NewsRepository
中添加一个方法来检索所有需要存档的新闻,并在需要时将他们的 isArchived
布尔方法从 false 更新为 true。
然后,我想到了在存储库中添加用于归档新闻的逻辑,以便它可以在 Command 之外使用。我还可以将逻辑(MySQL 更新)放在命令中,并且只在存储库中包含“'find'”查询。
以下哪种方法更可取,为什么?我的存储库方法应该是 findNewsToArchive
并在命令中执行更新逻辑,还是应该是 archiveAllNewsThatNeedsToBeArchived
并在存储库中执行所有逻辑?
在你的命令中使用你的所有逻辑对你的情况来说是一种不好的做法,你在技术上有两个独立的东西 find/archive,如果我是你,我将使用我的存储库和两个函数 findNews(array $criteria): array
, archive(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 中的所有内容然后将数据提交回数据库之间更改数据的问题。