【问题标题】:Array to DB::insert()->values(), which is in different order with the columns数组到 DB::insert()->values(),与列的顺序不同
【发布时间】:2017-11-17 11:05:50
【问题描述】:

大家好!我正在尝试将数据作为数组从 controller 传输到 model,然后将数据粘贴到查询生成器,但数据的顺序必须与列中指定的顺序相同。

  • 我有哪些选择?
  • 您认为这是一种不好的做法吗?

控制器:

            $responseNotes = Model::factory('Notes')-> createTicket([
                'description'   => htmlspecialchars($_POST['description']),
                'contact_id'    => $_POST['contact_id'],
                'pref_contact'  => $_POST['pref_contact'],
                'dog_id'        => $_POST['document_id'],
                'type'          => $_POST['type'],
                'owner_id'      => Auth::instance()->get_user()->id,
                'cc'            => $_POST['cc-emails'],
                'title'         => $_POST['title']
            ]);

型号:

public function createNote(array $data)
{
    $columns = [
        'type',
        'owner_id',
        'cc',
        'title',
        'description',
        'contact_id',
        'pref_contact',
        'dog_id'
    ];
    if (!array_diff($columns, array_keys($data))) {
        // All needed values exists
        $result = DB::insert($this->NOTES, $columns)-> values($data)-> execute($this->SCHEMA);
    }
    return  ($result) ? $result : false ;
}

【问题讨论】:

    标签: arrays model-view-controller kohana query-builder


    【解决方案1】:

    感谢this answer。解决了这个问题:

    // Order $data array according to $column.values
    $orderedData = [];
    foreach ($columns as $key) {
        $orderedData[$key] = $data[$key];
    }
    $result = DB::insert($this->TICKETS, $columns)
        -> values($orderedData)
        -> execute($this->SCHEMA);
    

    【讨论】:

      【解决方案2】:

      为什么不使用ORM Model

      在控制器中:

      $responseNotes = ORM::factory('Notes')-> values([
                      'description'   => htmlspecialchars($_POST['description']),
                      'contact_id'    => $_POST['contact_id'],
                      'pref_contact'  => $_POST['pref_contact'],
                      'dog_id'        => $_POST['document_id'],
                      'type'          => $_POST['type'],
                      'owner_id'      => Auth::instance()->get_user()->id,
                      'cc'            => $_POST['cc-emails'],
                      'title'         => $_POST['title']
                  ])
      try{
         $responseNotes->save();
      } catch (ORM_Validation_Exception $ex) { 
         print_r($ex->errors('models'));
      }
      

      并且不要使用htmlspecialchars($_POST['description'])

      在模型类中修改函数(doc):

      public function filters()
      {
          return array(
            'description' => array( array('htmlspecialchars') ),
          );
      }
      

      【讨论】:

        【解决方案3】:

        看起来你有具有 db_column=>value 结构的关联数组,对吗?比你可以简单地插入这样的:

        DB::Insert('table_name',array_keys($data))->values(array_values($data))->execute();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-25
          • 1970-01-01
          • 2012-01-27
          相关资源
          最近更新 更多