Есть ли способ автоматического обновления всех соответствующих полей? Если я знаю, что все данные отправлены, я могу сделать это:
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();