我使用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的串联
我不建议这样做,因为如果没有查找,它可能是不安全的。