Doctrine ODM - обновлены поля - PullRequest
       58

Doctrine ODM - обновлены поля

0 голосов
/ 19 октября 2019

Есть ли способ автоматического обновления всех соответствующих полей? Если я знаю, что все данные отправлены, я могу сделать это:

 return $this->dm->createQueryBuilder(Product::class)
                ->findAndUpdate()
                ->field('_id')->equals($data['id'])
                ->field('author_id')->equals($id)
                ->field('known_fields')->set($data['known_fields'])
                ->getQuery()
                ->execute();

, но если $ data изменится, например:

$data['known_field' => '...', 'unknown_field' => '...']

, чтобы решить проблему, я делаю это,

public function update(String $id, $data)
    {
        try {

            $query = $this->dm->createQueryBuilder(Product::class)
                ->findAndUpdate()
                ->field('_id')->equals($data['id'])
                ->field('author_id')->equals($id);

                $this->updateFields($query, $data)
                    ->getQuery()
                    ->execute();

        } catch (MongoDBException $e) {
            return new JsonResponse(['message' => $e->getMessage()]);
        }
    }

    public function updateFields(Builder $dm, $data)
    {
        unset($data['id'], $data['author_id']);
        foreach ($data as $key => $field) {
            $dm->field($key)->set($field);
        }

        return $dm;
    }

а другого красивого решения нет? может быть так:

 return $this->dm->createQueryBuilder(Product::class)
                ->findAndUpdate()
                ->field('_id')->equals($data['id'])
                ->field('author_id')->equals($id)
                ->sets(['field' => 'value', 'field_2' => 'value_2', ...])
                ->getQuery()
                ->execute();

1 Ответ

0 голосов
/ 19 октября 2019

Нет способа установить несколько полей для обновления в ODM. Правильный подход к написанию собственного цикла.

...