【问题标题】:Best Practices for Inserting and Updating Multiple Rows in database在数据库中插入和更新多行的最佳实践
【发布时间】:2017-07-01 04:02:49
【问题描述】:

我有一项技能,用户可以从中添加更多技能。

这是我student_skill的表格:

+------+--------------+--------------------------------------+
| id   | student_id   | skill                                |
+------+--------------+--------------------------------------+
| 1    | 1            | 10                                   |
| 2    | 1            | 3                                    |
| 3    | 2            | 2                                    |
| 4    | 2            | 6                                    |
+------+--------------+--------------------------------------+

我的 HTML 表单:

<form action="<?= base_url('skill/add_new_skill') ?>" method="post">
    Select Skills:
    <select name="skill[]" id="skill" multiple>
      <option value="1">Physics</option>
      <option value="2">Accounting </option>
      <option value="3">Business Activity Monitoring</option>
      <option value="4">Redhat Linux </option>
      // More Skill Options Here 
    </select>  
    <input type="submit" name="submit">
</form>

问题:

我不明白如何插入和更新多行。 我想使用insert_batch & update_batch 来添加和更新技能。

到目前为止我做了什么?

这是我的控制器代码:

//Controller Functions
public function insert_skill(){
    $this->load->model ('skill_model');
    $skill_data = $this->input->post();

    $update_status = $this->skill_model->insert_student_skill($skill_data); 

}

public function update_skills(){
    $this->load->model ('skill_model');
    $skill_data = $this->input->post();

    $update_status = $this->skill_model->update_student_skills($skill_data);    

}

//Model Functions
//Update Skill Model
public function update_student_skills($skill_data){

    //What should i do to update student data
    $this->db->update_batch('student_skill', $skill_data);

}

//Insert Skill Model
public function insert_student_skill($skill_data){

    //What should i do to Insert student data
    $this->db->insert_batch('student_skill', $skill_data);

}

问题案例场景1:如果用户选择'Physics','Accounting' First and In 如果用户根据 'Physics','Redhat Linux'我如何更新这种类型的技能 场景?

【问题讨论】:

  • @YamanJain 你能就这个问题提出任何建议吗?
  • refer this 可能对你有帮助。
  • 注意这个表中的代理id是多余的
  • 我已经尝试过你的解决方案,我在问题中添加了场景。插入完美完成。但是更新@Nidhi的问题
  • @Strawberry 先生,我不明白你在说什么。你能详细说明一下吗?谢谢。

标签: php mysql codeigniter


【解决方案1】:

请通过以下内容了解 CI 查询生成器中的批处理过程。

插入批次

使用insert_batch 命令时,第一个参数为table_name,第二个参数为插入数组。

$data = array(
        array(
                'title' => 'My title',
                'name' => 'My Name',
                'date' => 'My date'
        ),
        array(
                'title' => 'Another title',
                'name' => 'Another Name',
                'date' => 'Another date'
        )
);

$this->db->insert_batch('table_name', $data);

update_batch 当您使用update_batch 命令时,您的第一个参数将是table_name,第二个参数将是带有where 条件的值的数组,第三个参数将包含field_name for where 条件。

$data = array(
   array(
      'title' => 'My title' ,
      'name' => 'My Name 2' ,
      'date' => 'My date 2'
   ),
   array(
      'title' => 'Another title' ,
      'name' => 'Another Name 2' ,
      'date' => 'Another date 2'
   )
);

$this->db->update_batch('mytable', $data, 'title');

在您的情况下,您需要实现如下所述的登录。

IN 控制器

IN 控制器方法你需要传递user_id 字段。请在下方查看。

// Insert Function
$update_status = $this->skill_model->insert_student_skill($skill_data,$user_id); 

// Update Function
$update_status = $this->skill_model->update_student_skills($skill_data,$user_id);  

IN 模型

// Update Data
public function update_student_skills($skill_data,$user_id){

    $this->db->where('user_id',$user_id);
    $this->db->delete('student_skill');

    $ins_data = array();
    foreach($skill_data as $i => $skills):
        $ins_data[$i]['user_id'] = $user_id;
        $ins_data[$i]['skill_id'] = $skills['skill_id'];
    endforeach;

    $this->db->insert_batch('student_skill', $ins_data);

}

//Insert Skill Model
public function insert_student_skill($skill_data,$user_id){

    $ins_data = array();
    foreach($skill_data as $i => $skills):
        $ins_data[$i]['user_id'] = $user_id;
        $ins_data[$i]['skill_id'] = $skills['skill_id'];
    endforeach;

    $this->db->insert_batch('student_skill', $ins_data);

}

请根据您的要求修改上述代码。

【讨论】:

  • 我已经尝试过您的解决方案,我在问题中添加了场景。插入完美完成。但是更新中的问题。
  • 显示您的错误并请提及您的 where 条件。
  • 知道了。在您的情况下,最简单的方法是首先您需要删除该用户的所有技能,然后再插入。 $this-&gt;db-&gt;where('user_id',$user_id); $this-&gt;db-&gt;delete('student_skill'); 然后$this-&gt;db-&gt;insert_batch('student_skill', $ins_data);
  • 这是一种解决方法,所以基本上,update_batch 在这种情况下不会使用。这是最佳做法吗?
  • 我接受了你的回答,因为它给出了我想要的完美结果,但我仍然不相信删除和重新插入行。
【解决方案2】:

首先,您应该按会话拥有当前用户的 id。因此,您可以按 id 定位行进行更改。

你的看法。

<form action="<?= base_url('skill/update_skill') ?>" method="post">
    Select Skills:
    <select name="skill[]" id="skill" multiple>
      <option value="1">Physics</option>
      <option value="2">Accounting </option>
      <option value="3">Business Activity Monitoring</option>
      <option value="4">Redhat Linux </option>
      // More Skill Options Here 
    </select>  
    <input type="submit" name="submit">
</form>

控制器

    <?php
defined('BASEPATH') OR exit('No direct script access allowed');

    class Skill extends CI_Controller {

      function __construct() {
        parent::__construct();
        $this->load->model('skill_model');
      }

      public function index(){
        $this->load->view('/your_view');
      } // end index function

      function update_skill(){
         $value = $this->input->post('skill');
         $data['skill'] = $value; //it's mean value or rows skill will be inserted/updated

         $current_user_id = '1'; // example: current user id is 1 (set it by session). this is shuold in new Stackoverflow question

         // Now send data and id to model
         $this->skill_model->update_data($data, $current_user_id);
      }

    } // end Class

型号

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Skill_model extends CI_Model{

function update_data($data, $current_user_id){
       $this->db->where('id', '$current_user_id');
       $this->db->update('student_skill', $data);

       //after done, if want do something put codes below.
       redirect(site_url('skill')); //example, after done update, redirect user to mysite.com/skill

} // end update_date()


/* you can add another function in this model. maybe will used from another controller 

function another($fromanother){
}

*/

} // end Class

【讨论】:

    猜你喜欢
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 2015-08-31
    • 2016-03-04
    • 2010-10-17
    相关资源
    最近更新 更多