[英]Propel ORM: Add a column from another table which is not connected with a direct foreign key
[英]Propel ORM - Using setByName on a column from a delegated table
我正在使用Propel ORM使加载和保存相当大的表单到数据库中的事情变得更容易。 表单很大,但是几乎是平面数据,因此它本质上是一个有数百列的大表(我们称其为人)。 我不想在一个表中有几百列,所以我有一个主表和一堆一对一的子表。
我正在使用此处描述的委托行为。 这很好,因为我可以调用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,并且我有一个名为“收藏夹”的委托表,并且具有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的串联
我不建议这样做,因为如果不进行查找,可能会导致不安全。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.