0

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

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

当用户编辑表单并提交时,我使用 POST 将表单数据发送到服务器。然后,我遍历该 POST 数据,以便将其分配给 person 对象,并使用“ 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列表。谢谢!

4

1 回答 1

0

也许您可以查找字段。

$lookup = array('color' => 'setColor');

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

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

我不推荐这样做,因为如果没有查找,它可能不安全。

于 2015-10-30T17:50:41.447 回答