Php 在Datamapper ORM中更改循环中的对象

Php 在Datamapper ORM中更改循环中的对象,php,codeigniter,orm,codeigniter-datamapper,Php,Codeigniter,Orm,Codeigniter Datamapper,我试图在Codeigniter的数据映射器中保存一个长表单。如果我像这样传递值,我就可以保存表单 $t->brandName = $this->input->post('brandName'); $t->specialNotes = $this->input->post('specialNotes'); $t->name = $this->input->post('name'); 现在,如果我调用save方法,它就会工作 $t->

我试图在Codeigniter的数据映射器中保存一个长表单。如果我像这样传递值,我就可以保存表单

$t->brandName = $this->input->post('brandName');  
$t->specialNotes = $this->input->post('specialNotes');
$t->name = $this->input->post('name');
现在,如果我调用save方法,它就会工作

 $t->save();
由于表单很大,我尝试在foreach中添加对象值

 $a = get_object_vars($t);
 foreach ($a['stored'] as $k => $val){
      $t->$k = $this->input->post("$k"); 
 }

但是,如果我调用
$t->save()
,它将不起作用

我不确定
$a['stored']
代表什么,但在Datamapper中它并不是默认值

你为什么不反其道而行之,在柱子上打圈

foreach ($_POST as $key => $val)
{
    $t->$key = $this->input->post($key); 
}
$t->save();
注意:Datamapper只会忽略任何不存在的列


实际上,我为此编写了一个Datamapper扩展:

class DM_Data {

    function assign_postdata($object, $fields = NULL)
    {
        // You can pass a different field array if you want
        if ( ! $fields)
        {
            $fields = $object->validation;
        }
        foreach ($fields as $k => $data)
        {
            $rules = isset($data['rules']) ? $data['rules'] : array();

            if ( ! isset($_POST[$k])) continue;

            // Cast value to INT, usually for an empty string.
            if (in_array('integer', $rules))
            {
                $object->$k = (integer) $_POST[$k];
            }
            // Do other manipulation here if desired
            else
            {
                $object->$k = $_POST[$k];
            }

        }
        return $object;
    }

}

您可以使用
$t->assign_postdata()->save()
,还可以选择将要更新的字段数组传递给函数(采用datamapper验证格式)。然而,我忘了为什么我用那个。。。但是我去掉了一些定制的东西。如果你经常这样做,这应该对你有用。这确实节省了我的时间。

@MakDotGNU:我添加了一点代码,您可能会感兴趣。谢谢@wesley,这将帮助我。