Я написал API с функцией, которая устанавливает уведомление как прочитанное, передавая его идентификатор.
Но также должна быть возможность передавать туда массив 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();
}
Кроме того, вместо выбора и последующего сохранения выбранных элементов быстрее создать запрос на обновление: UPDATE table SET read = true WHERE id IN (your ids).
Насколько мне известно, findBy() можно передать массив идентификаторов; например: findBy(['id' => [1, 2, 3]])
@Йоши щёлкни! :)






Вы действительно можете передать массив значений id в \Doctrine\ORM\EntityRepository::findBy(); например:
$notifications = $this->getRepository()->findBy([
'id' => [1, 2, 3] // etc.
]);
Однако, поскольку findBy() может возвращать несколько результатов, он вернет массив (или подобный массиву объект, например Doctrine\ORM\PersistentCollection). Поэтому вы должны перебрать свой набор результатов:
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]);
}
Надеюсь это поможет :)
Немного педантично, но я бы реорганизовал read, чтобы просто вызвать $this->readMany([$id]);.
Рад помочь :) Хороший вопрос!
findByищет по прямому эквиваленту. Таким образом, передача массива идентификаторов не будет работать.