Doctrine/Symfony 如何使用数组中的特定数据更新实体

Yam*_*sif 0 php symfony doctrine-orm

我环顾四周太久没有运气。我的情况是我有一个有点大的表 +60 列,它在 Doctrine Entity 中表示。在 FosREST 上工作,我想要实现的是我想发送一个带有特定数据的 JSON,例如

[phone] => new_phone
[name] => new_name
[id] => 1
Run Code Online (Sandbox Code Playgroud)

虽然就像我说的,实体包含超过 60 列,如地址、图片、类别等...

电话、姓名和身份证不是我每次都想更改的,但我每次都想更改一些列。所以有时我可能想更新电话和姓名,其他时候我想第三次更改类别我想更改类别、照片和地址,所以有这样的吗?

$entity->update($parameters);
Run Code Online (Sandbox Code Playgroud)

如前所述, $parameters 是动态更改的。附:我知道我可以用类似的东西构建一个很长的函数

if(isset($parameters['name']){
     $entity->setName($parameters['name']);
}
Run Code Online (Sandbox Code Playgroud)

但是对于 60 ifs,这听起来很愚蠢,有人有其他方法吗?谢谢

LP1*_*154 5

1)如果参数以属性命名(这里有下划线注释),可以这样做

use Doctrine\Common\Util\Inflector;
// ...

public function setParameters($params) {
    foreach ($params as $k => $p) {
        $key = Inflector::camelize($k);
        if (property_exists($this, $key)) {
            $this->$key = $p;
        }
    }
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

2)与二传手相同

use Doctrine\Common\Util\Inflector;
// ...

public function setParameters($params) {
    foreach ($params as $k => $p) {
        $key = Inflector::camelize($k);
        if (property_exists($this, $key)) {
            $this->{'set'.ucfirst($key)}($p); // ucfirst() is not required but I think it's cleaner
        }
    }
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

3)如果名称不同,您可以这样做:

public function setParameters($params) {
    foreach ($params as $k => $p) {
        switch $k {
            case 'phone':
                $this->phoneNumber = $p;
                break;
            // ...
        }
    }
    return $this;
}
Run Code Online (Sandbox Code Playgroud)

编辑:最佳方法是第二,但您应该定义白名单或黑名单,以避免用户更新您不希望他更新的内容。