Propel ORM - 在委托表

时间:2015-10-06 07:41:13

标签: php database propel2

我正在使用Propel ORM来简化加载和将大型表单保存到数据库的过程。形式是巨大的,但它是非常平坦的数据,所以它基本上是一个大表(让我们称之为人)与几百列。我不想在一个表中有几百列,所以我有一个主表和一堆一对一的子表。

我正在使用here描述的委托行为。这很好,因为我可以调用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列表。谢谢!

1 个答案:

答案 0 :(得分:0)

也许您可以查找字段。

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

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

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

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