我正在使用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列表。谢谢!
答案 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
我不建议这样做,因为如果没有查找,它可能会不安全。