我编写了一个带有函数的 api,该函数通过传递通知的 id 将通知设置为已读。
而且,应该有一个选项可以在那里传递 id 数组,一次将几个标记为已读。我应该扩展函数,以便它处理$this>data['id']是一个数组的情况。
这是正确的方法吗?
我的服务:
public function read($id = []){
$notification = $this->getRepository()->findBy([
'id' => $id
]);
if($notification) {
$notification[0]->setRead(new DateTime());
$this->em->flush();
}
}
我的控制器:
public function readAction()
{
$this->requirePostParams(['id']);
$this->get('app')->read(
$this->data['id']
);
return $this->success();
}
你确实可以将一个id
值数组传递给DoctrineORMEntityRepository::findBy()
;例如:
$notifications = $this->getRepository()->findBy([
'id' => [1, 2, 3] // etc.
]);
但是,由于findBy()
可以返回多个结果,因此它将返回一个数组(或类似数组的对象,如 DoctrineORMPersistentCollection
(。因此,应循环访问结果集:
foreach ($notifications as $notification) {
$notification->setRead(new DateTime());
}
$this->em->flush();
此外,这在某种程度上是一个品味问题,但您可能希望使您的 API 更加明确,并为单个操作与组操作创建单独的方法;例如:
public function read(int $id)
{
//in this scenario you are searching for one notification
// only so you can use `findOneBy()` instead
$notification = $this->getRepository()->findOneBy(['id' => $id]);
$notification->setRead(new DateTime());
$this->em->flush();
}
public function readMany(array $ids)
{
$notification = $this->getRepository()->findBy(['id' => $ids]);
foreach ($notifications as $notification) {
$notification->setRead(new DateTime());
}
$this->em->flush();
}
正如@Yoshi所指出的,read()
也可以整齐地实现为:
public function read(int $id)
{
$this->readMany([$id]);
}
希望这对:)有所帮助