изменение объекта в цикле в Datamapper ORM

#php #codeigniter #orm #codeigniter-datamapper

#php #codeigniter #orm #codeigniter-datamapper

Вопрос:

Я пытаюсь сохранить длинную форму в Datamapper от Codeigniter. Я могу сохранить форму, если передам значение следующим образом

 $t->brandName = $this->input->post('brandName');  
$t->specialNotes = $this->input->post('specialNotes');
$t->name = $this->input->post('name');
  

Теперь, если я вызываю метод сохранения, он работает

  $t->save();
  

Поскольку форма большая, я попытался добавить значения объекта в foreach

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

однако, если я вызываю $t->save() , это не работает.

Ответ №1:

Я не уверен, что $a['stored'] представляет, но это не то, что по умолчанию используется в Datamapper.

Почему бы вам не сделать это наоборот, перебрав ключи post?

 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). Однако я забыл, зачем я это использую … но я удалил некоторые пользовательские материалы. Это должно быть полезно для вас, если вы часто этим занимаетесь. Это определенно экономит мне время.

Комментарии:

1. @MakDotGNU: Я добавил немного кода, который может вас заинтересовать.