Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony- passing an array of ids

I wrote an api with a function that sets notification as read by passing it's id.

But also, there should be an option to pass array of ids there, to mark several at once as read. I should extend function so that it handles the case where $this>data['id'] is an array.

Is this the right way?

My Service:

 public function read($id = []){

 $notification = $this->getRepository()->findBy([
        'id' => $id
    ]);

    if($notification) {
       $notification[0]->setRead(new \DateTime());
       $this->em->flush();
    }
}

My Controller:

public function readAction()
{
    $this->requirePostParams(['id']);
    $this->get('app')->read(
        $this->data['id']
    );

    return $this->success();
}
like image 601
dev.elop Avatar asked Oct 29 '25 13:10

dev.elop


1 Answers

You can indeed pass an array of id values to \Doctrine\ORM\EntityRepository::findBy(); e.g:

$notifications = $this->getRepository()->findBy([
    'id' => [1, 2, 3] // etc.
]);

However, since findBy() can return multiple results, it will return an array (or array-like object like Doctrine\ORM\PersistentCollection). Therefore you should iterate over your result set:

foreach ($notifications as $notification) {
    $notification->setRead(new \DateTime());
}

$this->em->flush();

Additionally, it's a matter of taste to some degree but you may want to make your API more explicit and create separate methods for a single action versus a group action; e.g:

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();
}

As pointed out by @Yoshi, read() could also be neatly implemented as:

public function read(int $id)
{
    $this->readMany([$id]);
}

Hope this helps :)

like image 169
Darragh Enright Avatar answered Nov 01 '25 04:11

Darragh Enright



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!