在委托表的列上使用setByName

  • 本文关键字:setByName php database propel2
  • 更新时间 :
  • 英文 :


我使用Propel ORM使加载和保存一个相当大的表单到数据库更容易。表单很大,但它是相当平坦的数据,所以它本质上是一个大表(我们称之为persons),有几百列。我不想在一个表中有几百列所以我有一个主表和一堆一对一的子表。

我正在使用这里描述的委托行为。这很好,因为我可以调用PersonQuery::create()->findPK($id)->toArray()它不仅给我Person中的数据还给我每个子表中的数据。然后,我可以很容易地将这些数据加载到我的表单中。

当用户编辑表单并提交它时,我使用POST将表单数据发送到服务器。然后,我迭代该POST数据,以便将其分配给一个人对象,我使用"setByName"来执行此操作,而不是使用Propel提供的特定功能。所以我们不这样做:

   $person = PersonQuery::create()->findPK($id);
   $person->setAge($_POST['age']);
   $person->setName($_POST['name']);
   //repeat for hundreds of columns

我可以这样做:

$person = PersonQuery::create()->findPK($id);
foreach($_POST as $field=>$value){
   //before you ask, yes, i validate $field here
   $person->setByName($field, $value);
}

我遇到的问题是这对我的委托表不起作用。因此,如果我的主表是Person,我有一个名为Favorites的委托表,带有字段Color,我可以执行$person->setColor('Blue'),但不能执行$person->setByName('Color','Blue')

所以…我是否可以做上述或类似的事情?我不想为每一列都写setter然后在数据库改变时更新setter列表。谢谢!

也许您可以查找字段。

$lookup = array('color' => 'setColor');
foreach ($_POST as $fieldName => $fieldValue) {
    if (isset($lookup[$fieldName])) {
        $func = $lookup[$fieldName];
        $person->$func($fieldValue);
    }
}

你不需要查找数组,你的函数可以是'set'和ucwords($fieldName) = setColor的串联

我不建议这样做,因为如果没有查找,它可能是不安全的。

最新更新