[英]Doctrine ODM - Updated fields provided
There is a way for automatically update all relevant fields?有没有办法自动更新所有相关字段? If I know all data send, I can do this:
如果我知道所有数据发送,我可以这样做:
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();
but if $data change, for example:但如果 $data 发生变化,例如:
$data['known_field' => '...', 'unknown_field' => '...']
to solve the problem I do this,为了解决我这样做的问题,
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;
}
but there is not an another beautiful solution?但是没有另一个漂亮的解决方案吗? maybe like this:
也许是这样的:
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();
There is no way to set several fields to update in the ODM.无法在 ODM 中设置多个要更新的字段。 Writing your own loop is correct approach.
编写自己的循环是正确的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.