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

25 mysql codeigniter

是否可以在CodeIgniter中执行活动记录查询,如果现有记录已经存在,则更新现有记录,如果不存在则为给定密钥插入?

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

Par*_*us- 30

基本上你正在寻找的可能是这个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
                                      ));
Run Code Online (Sandbox Code Playgroud)


小智 23

如果使用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);
Run Code Online (Sandbox Code Playgroud)

不需要电池!!!

  • 但这有更新问题,当有自动增量id时,它会在replce时增加 (2认同)

Mil*_*aza 5

你可以做得更简单:

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


sid*_*esh 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;

  }
}
Run Code Online (Sandbox Code Playgroud)

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

class some_model extends MY_Model
Run Code Online (Sandbox Code Playgroud)

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

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

祝你好运

  • OP已经知道这个方法了。他想知道有什么可行的有效方法。 (2认同)