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;
}
}
$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
* /
9条答案
按热度按时间v7pvogib1#
基本上,您要查找的内容可能是**
INSERT ... ON DUPLICATE KEY UPDATE
**-前提是您使用的是MySQL,并且您的id是表中的唯一键。您必须手动构造查询并传递给
$this->db->query()
函数,而不是任何内置的活动记录,如DB驱动程序的帮助器函数。范例:
wqlqzqxt2#
如果您使用Codeigniter 3.0或更高版本,您可能需要考虑使用“$this-〉db-〉replace()"。根据用户指南:
此方法执行REPLACE语句,它基本上是(可选得)DELETE + INSERT得SQL标准,使用PRIMARY与UNIQUE键作为决定因素.在我们得示例中,它将使您不必使用select(),update(),delete()与insert()调用得不同组合来实现复杂得逻辑.
换句话说,
直接使用即可,例如:
无需电池!!!
agyaoht73#
你可以做得更简单:
nxowjjhe4#
我不知道Codeigniter活动记录类是否具有此方法,也不知道是否检查codeigniter docs以查找活动记录类中包含的方法
但是你可以通过扩展codigniter的核心模型来实现这一点。通过使用这种方式,你可以将这种方法用于所有扩展该模型类的模型。只需将
MY_model.php
放入application/core/中,并编写以下代码。创建上述文件后,您必须将All your models父类更改为新的扩展模型,即MY_Model
注意:您必须从结果中选择主键,并将其放入where条件中。
这一点非常关键,因此,当我从控制器获取数据时,我所做的只是检查它是否具有ID,如果ID存在,则触发更新查询,如果不存在,则触发插入查询。
“祝你好运”
6tr1vspr5#
我采用的是这种方法:
1.使用要更新的
column xyz
的unique id
和unique
键配置表mytable
1.尝试插入一个数组
$data
,使用INSERT IGNORE INTO
避免重复如果
column xyz
中的值不存在,则插入一行1.如果插入了行,则使用函数
insert_id()
返回id
,如果没有插入行,则更新。fzsnzjdm6#
这里有一个方法,我希望可以完成同样的
guicsvcw7#
如果Marcos Sánchez Urquiola在他的回答中建议的替换解决方案不适用于您,因为您有一个自动增量列,下面是最简洁的方法,同时避免了自己引用/整理输入,让Codeigniter来做。
bq9c1y668#
首先需要检查用户或数据是否存在,然后才可以进行更新和插入操作。
cdmah0mi9#
更新了Milaza的回答-简单地完成