我环顾四周,没有运气。我的情况是,我有一些大的表 60列,该列在学说实体中表示。在Fosrest上工作,我想实现的目标是我想发送一个带有特定数据的JSON,例如
[phone] => new_phone
[name] => new_name
[id] => 1
就像我说的那样,该实体包含60多列,例如地址,图片,类别等...
和电话,名称和ID并不是我每次都想更改的内容,但我想每次都更改一些列。因此,在某个时候,我可能想更新电话并命名其他时间,我想第三次更改类别,我想更改类别,照片和地址所以有这样的东西吗?
$entity->update($parameters);
$参数如前所述动态更改。PS。我知道我可以用
之类的东西构建一个很长的功能if(isset($parameters['name']){
$entity->setName($parameters['name']);
}
但是有60个IF这听起来像是愚蠢的,有人还有其他方法吗?谢谢
1)如果参数是以属性命名的(这里有下划线注释),则可以执行此操作
use DoctrineCommonUtilInflector;
// ...
public function setParameters($params) {
foreach ($params as $k => $p) {
$key = Inflector::camelize($k);
if (property_exists($this, $key)) {
$this->$key = $p;
}
}
return $this;
}
2)播放器的同一件事
use DoctrineCommonUtilInflector;
// ...
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;
}
3)如果它的名称不是同一名,则可以执行此操作:
public function setParameters($params) {
foreach ($params as $k => $p) {
switch $k {
case 'phone':
$this->phoneNumber = $p;
break;
// ...
}
}
return $this;
}
编辑:最佳方法是第二名,但您应该定义白名单或黑名单,以避免用户更新您不希望他的东西。