我正在使用 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列表。谢谢!