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,这听起来很愚蠢,有人有其他方法吗?谢谢
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)
编辑:最佳方法是第二,但您应该定义白名单或黑名单,以避免用户更新您不希望他更新的内容。