mysql CodeIgniter-如果是新记录,则插入活动记录,如果是重复记录,则更新记录

goucqfw6  于 2022-10-31  发布在  Mysql
关注(0)|答案(9)|浏览(162)

对于给定的键,是否可以在CodeIgniter中执行活动记录查询,如果已经存在记录,则更新现有记录,如果不存在记录,则插入现有记录?
我知道这可以通过首先查询以查找现有记录来完成,但我正在寻找最有效的方法。

v7pvogib

v7pvogib1#

基本上,您要查找的内容可能是**INSERT ... ON DUPLICATE KEY UPDATE**-前提是您使用的是MySQL,并且您的id是表中的唯一键。
您必须手动构造查询并传递给$this->db->query()函数,而不是任何内置的活动记录,如DB驱动程序的帮助器函数。

范例:

$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
                                      ));
wqlqzqxt

wqlqzqxt2#

如果您使用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);

无需电池!!!

agyaoht7

agyaoht73#

你可以做得更简单:

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

nxowjjhe4#

我不知道Codeigniter活动记录类是否具有此方法,也不知道是否检查codeigniter docs以查找活动记录类中包含的方法
但是你可以通过扩展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;

  }
}

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

class some_model extends MY_Model

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

这一点非常关键,因此,当我从控制器获取数据时,我所做的只是检查它是否具有ID,如果ID存在,则触发更新查询,如果不存在,则触发插入查询。
“祝你好运”

6tr1vspr

6tr1vspr5#

我采用的是这种方法:
1.使用要更新的column xyzunique idunique键配置表mytable
1.尝试插入一个数组$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);

如果column xyz中的值不存在,则插入一行
1.如果插入了行,则使用函数insert_id()返回id,如果没有插入行,则更新。

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

fzsnzjdm6#

这里有一个方法,我希望可以完成同样的

/**
    * 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);
}
guicsvcw

guicsvcw7#

如果Marcos Sánchez Urquiola在他的回答中建议的替换解决方案不适用于您,因为您有一个自动增量列,下面是最简洁的方法,同时避免了自己引用/整理输入,让Codeigniter来做。

$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' => 'john.smith@devnullmail.com',
];

// 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

* /
bq9c1y66

bq9c1y668#

首先需要检查用户或数据是否存在,然后才可以进行更新和插入操作。

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);
    }
  }
cdmah0mi

cdmah0mi9#

更新了Milaza的回答-简单地完成

$updt_str = '';
    foreach ($array as $k => $v) {
        $updt_str = $updt_str.' '.$k.' = '.$v.',';
    }
    $updt_str = substr_replace($updt_str,";", -1);
    $this->db->query($this->db->insert_string('table_name', $array).' ON DUPLICATE KEY UPDATE '.$updt_str);

相关问题