Symfony - передача массива идентификаторов

Я написал 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();
}
findBy ищет по прямому эквиваленту. Таким образом, передача массива идентификаторов не будет работать.
u_mulder 12.02.2019 13:52

Кроме того, вместо выбора и последующего сохранения выбранных элементов быстрее создать запрос на обновление: UPDATE table SET read = true WHERE id IN (your ids).

u_mulder 12.02.2019 13:53

Насколько мне известно, findBy() можно передать массив идентификаторов; например: findBy(['id' => [1, 2, 3]])

Darragh Enright 12.02.2019 13:58

@Йоши щёлкни! :)

Darragh Enright 12.02.2019 13:58
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
4
916
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы действительно можете передать массив значений 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]);.

Yoshi 12.02.2019 14:18

Рад помочь :) Хороший вопрос!

Darragh Enright 12.02.2019 15:16

Другие вопросы по теме