0

A 有很多控制器,我必须在其中保存/创建新模型,它看起来像这样:

public Controller_Test extends Controller_Template {

    if ($post = $this->request->post()) {

        $model = ORM::factory('model');
        $model->param1 = $post['Param1'];
        $model->param2 = $post['Param26'];
        $model->param3 = $post['Param31'];
        $model->param4 = $post['Param13'];
        $model->param5 = $post['Param2'];
        $model->param6 = $post['Param35'];
        $model->param7 = $post['Param10'];
        $model->param8 = $post['Param22'];
        $model->param9 = $post['Param3'];
        $model->save();
    }    

}

是否可以统一(创建一个方法)以保存所有数组?

我知道$model->values($post)->create();,但仍然无法理解它是如何工作的,因为您可以看到我有不同的已发布参数键,这可能会被考虑。

在许多示例中,所有数据分配都发生在控制器中,但它们真的很小,在我的情况下,我假设有一个带有大量数据分配字符串的巨大控制器,我认为这将是一种糟糕的编码风格。

4

1 回答 1

0

无论您做什么,都需要将$_POST变量中的键名称映射到模型属性名称。

$model_post_map = array(
    'param1' => 'Param1',
    'param2' => 'Param26',
    'param3' => 'Param31',
    'param4' => 'Param13',
    'param5' => 'Param2',
    'param6' => 'Param35',
    'param7' => 'Param10',
    'param8' => 'Param22',
    'param9' => 'Param3',
);
$post_model_map = array_flip($model_post_map);

function rekey($arr, $map) {
    $newarr = array();
    foreach ($arr as $k => $v) {
        if (isset($map[$k])) {
            $newarr[$map[$k]] = $v;
        }
    }
    return $newarr;
}
$modeldata = rekey($post, $post_model_map);
$model->values($modeldata);

您应该按照创建模型的方式命名表单字段,以减少阻抗不匹配。

您还应该使用第二个参数$model->values()来限制表单可以更改的内容。

于 2013-02-20T18:18:56.147 回答