在Datamapper ORM中循环更改对象

时间:2011-05-11 18:00:03

标签: php codeigniter orm codeigniter-datamapper

我正在尝试在Codeigniter的Datamapper中保存一个长格式。如果我像这样传递值

,我就可以保存表单
$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()它就不起作用。

1 个答案:

答案 0 :(得分:1)

我不确定$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验证格式)。但是,我忘记了为什么我使用它...但我删除了一些自定义的东西。如果你这么做的话,这对你有用。这绝对可以节省我的时间。