繁体   English   中英

Propel ORM-在委托表的列上使用setByName

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM