Doctrine ODM-提供更新的字段

问题描述 投票:0回答:1

有一种方法可以自动更新所有相关字段?如果我知道所有数据都已发送,则可以执行此操作:

 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();
mongodb nosql symfony4 doctrine-odm odm
1个回答
0
投票

无法在ODM中设置要更新的多个字段。编写自己的循环是正确的方法。

© www.soinside.com 2019 - 2024. All rights reserved.