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)
不需要电池!!!
你可以做得更简单:
$sql = $this->db->insert_string(table, $array) . ' ON DUPLICATE KEY UPDATE ' .
implode(', ', $array);
$this->db->query($sql);
Run Code Online (Sandbox Code Playgroud)
我不知道 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 存在,那么我触发更新查询,如果不存在,那么我触发插入查询。
祝你好运
| 归档时间: |
|
| 查看次数: |
28039 次 |
| 最近记录: |