CodeIgniter-活动记录插入(如果是新的或更新重复的)

问题描述 投票:0回答:9

是否可以在 CodeIgniter 中执行活动记录查询,对于给定的键,如果现有记录已存在,则更新现有记录;如果不存在,则插入?

我知道这可以通过首先查询查找现有记录来完成,但我正在寻找最有效的方法。

php mysql codeigniter
9个回答
35
投票

基本上你正在寻找的可能是这个

INSERT ... ON DUPLICATE KEY UPDATE
- 前提是你正在使用MySQL并且你的id是表上的唯一键。

您必须手动构建查询并传递给

$this->db->query()
函数,而不是任何内置的活动记录,例如数据库驱动程序的辅助函数。

示例:

$sql = 'INSERT INTO menu_sub (id, name, desc, misc)
        VALUES (?, ?, ?, ?)
        ON DUPLICATE KEY UPDATE 
            name=VALUES(name), 
            desc=VALUES(desc), 
            misc=VALUES(misc)';

$query = $this->db->query($sql, array( $id, 
                                       $this->validation->name, 
                                       $this->validation->desc, 
                                       $this->validation->misc
                                      ));

28
投票

如果您使用 Codeigniter 3.0 或更高版本,您可能需要考虑使用“$this->db->replace()”。根据用户指南:

“此方法执行 REPLACE 语句,这基本上是(可选)DELETE + INSERT 的 SQL 标准,使用 PRIMARY 和 UNIQUE 键作为决定因素。在我们的例子中,它将使您免于使用不同的实现复杂逻辑的需要select()、update()、delete() 和 insert() 调用的组合。”

换句话说,

  • 如果不存在,则插入一条新记录。
  • 如果确实存在,则根据其主键或唯一键更新它。

开箱即用,如下所示:

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

$this->db->replace('table', $data);

无需电池!!!


5
投票

你可以做得更简单:

$sql = $this->db->insert_string(table, $array) . ' ON DUPLICATE KEY UPDATE ' .
implode(', ', $array);
$this->db->query($sql);

2
投票

我不知道 Codeigniter Active Record 类有此方法,或者没有检查 codeigniter 文档以获取 Active Record 类中包含的方法

但是你可以通过扩展 codigniter 的核心模型来实现这一点。 通过使用这种方式,您可以将此方法用于扩展此模型类的所有模型。 只需将

MY_model.php
放入 application/core/ 并编写以下代码即可。

Class MY_Model extends CI_Model
{
  public function insert_update($data)
  {
       // code for checking existing record.
       if(//existing record)
           fire the update query
       else
           fire the insert query

       return insert/update id;

  }
}

创建上述文件后,您必须将所有模型父类更改为新的扩展模型,即 MY_Model

class some_model extends MY_Model

注意:您必须从结果中选择主键并将其放入where条件中。

这非常关键,所以当我从控制器获取数据时,我要做的就是检查它是否有 ID,如果 Id 存在,则触发更新查询,如果不存在,则触发插入查询。

祝你好运


1
投票

我正在使用这种方法:

  1. 使用

    mytable
    unique id
    键配置您的桌子
    unique
    ,您要更新
    
    

  2. 尝试插入数组
  3. column xyz

    ,使用

    $data
    避免重复
    
    
    INSERT IGNORE INTO

    如果 
    $insert_query = $this->db->insert_string('bt_ical_list', $data); $insert_query = str_replace('INSERT INTO','INSERT IGNORE INTO',$insert_query); $this->db->query($insert_query);

    中的值不存在,则插入一行

    
    

  4. 使用函数
  5. column xyz

    如果插入了行则返回

    insert_id()
    ,如果没有插入行则更新。
    
    
    id

    
        

1
投票

if(!$this->db->insert_id()){ $query=$this->db ->where('xyz', $data['xyz']) ->update('my_table',$data); };



0
投票
他的回答

中建议的替换解决方案不适合您,因为您有一个自动增量列,以下是最干净的方法,同时避免必须自己引用/清理输入并让 Codeigniter 执行那个。 /** * Used to insert new row if a duplicate entry is encounter it performs an update * @param string $table table name as string * @param array $data associative array of data and columns * @return mixed */ private function updateOnExist($table, $data) { $columns = array(); $values = array(); $upd_values = array(); foreach ($data as $key => $val) { $columns[] = $this->db->escape_identifiers($key); $val = $this->db->escape($val); $values[] = $val; $upd_values[] = $key.'='.$val; } $sql = "INSERT INTO ". $this->db->dbprefix($table) ."(".implode(",", $columns).")values(".implode(', ', $values).")ON DUPLICATE KEY UPDATE".implode(",", $upd_values); return $this->db->query($sql); }



0
投票

$table = 'database.table'; // Usually you would have this in you model $primary_key = 'id'; // You would also have this in you model $data = [ 'id' => '14', 'name' => 'John Smith', 'email' => '[email protected]', ]; // get keys and remove primary_key if it has been included in the data array $updates_array = array_filter( array_keys($data), function($fieldName) use ($primary_key) { return $fieldName !== $primary_key; }); array_walk($updates_array, function(&$item){ $item = "{$item}=VALUES({$item})"; } ); $sql = $this->db->insert_string($table, $data) . ' ON DUPLICATE KEY UPDATE ' . implode(', ', $updates_array); $this->db->query($sql); /* Generates an insert statement with the following at the end: ON DUPLICATE KEY UPDATE name=VALUES(name), email=VALUES(email) This way you work with the values you already supplied to $this->db->insert_string */



-1
投票

function yourFuncName($id, $data) { $this->db->where('user_id', $id); $q = $this->db->get('tbl_user'); if ($q->num_rows() > 0) { $this->db->where('user_id', $id); $this->db->update('tbl_user', $data); } else { $this->db->set('user_id', $id); $this->db->insert('tbl_user', $data); } }

© www.soinside.com 2019 - 2024. All rights reserved.