使用 CodeIgniter Active Record 函数将子句添加到不带引号的 MySQL 语句

Posted

技术标签:

【中文标题】使用 CodeIgniter Active Record 函数将子句添加到不带引号的 MySQL 语句【英文标题】:Add a clause to a MySQL statement without quotes using CodeIgniter's Active Record functions 【发布时间】:2011-01-05 18:25:26 【问题描述】:

我想使用 codeigniter 中的活动记录更新一行,我只想增加一个字段值 (received_qty = received_qty +1) ,我意识到我可以在通常的 sql 中做到这一点,但我不能在 codeigniter 活动记录中

$update['received_qty'] = 'received_qty + 1';
$update['received_date'] = date("Y-m-d");
$this->db->where($where);
$this->db->update('vrs_distribution', $update);

有人知道如何使用活动记录吗?

【问题讨论】:

【参考方案1】:

这会起作用。

$this->db->set('received_qty', 'received_qty + 1', FALSE);
$this->db->set('received_date', date("Y-m-d"));
$this->db->where($where);
$this->db->update('vrs_distribution');

ActiveRecord 会转义放入 set()、where() 和许多其他方法中的所有内容。 Where 和 set 都可以采用 $escape 的可选第三个参数,它是一个布尔值。将其设置为 FALSE 并且 CodeIgniter 不会转义任何内容,这意味着您的字段增量不会被视为字符串。

【讨论】:

【参考方案2】:

或者你可以这样做:

$this->db->query('UPDATE vrs_distribution SET received_qty = received_qty + 1, received_date = CURDATE() WHERE id = ' . $id);

您需要修改 WHERE 子句以适合您

【讨论】:

【参考方案3】:

状态设置为零(更新)

$this->db->set('IsCurrent', '0');       
$this->db->where('AcademicYearID',$academicYearId);
$this->db->update('academicyear');  

【讨论】:

【参考方案4】:

我打算问一个类似的问题,只是有点不同,但问题是一样的:我需要更新一个带有间隔 (expiry_date = expiry_date + interval 3 month) 的日期,Phil Sturgeon's answer 确实解决了这个问题。

但是,我意识到您仍然可以将数组用于可以带引号的字段,这意味着您可以编写:

$this->db->set('received_qty', 'received_qty + 1', FALSE);
$this->db->set('expired_date', 'CURDATE() + INTERVAL 10 DAY', FALSE); //extra example 1
$update['received_date'] = date("Y-m-d");
$update['receiver'] = $receiver_name; //extra example 2
$this->db->where($where);
$this->db->update('vrs_distribution', $update);

$this->db->last_query() 的输出位置:

UPDATE `vrs_distribution`
  SET `received_qty` = received_qty + 1,
      `expiry_date` = CURDATE() + INTERVAL 10 DAY, #extra example 1
      `received_date` = '2015-07-01 16:00:00',
      `receiver` = 'strike_noir', #extra example 2
  WHERE #where clause with backticks

请注意,使用set() 的字段没有引号,而是首先出现。查询的其余部分有反引号(letting "CodeIgniter protect the remaining fields")。

【讨论】:

【参考方案5】:

您看起来很接近,CI 的 ActiveRecord(或在 SQL 中)中没有“增量一”命令。

$update['received_qty']++;
$update['received_date'] = date("Y-m-d");
$this->db->where($where);
$this->db->update('vrs_distribution', $update);

【讨论】:

对不起,伙计,但有,ActiveRecord 只是将所有输入作为字符串转义,除非另有说明。 一定是迟到了,不然我早点上吧。哎呀。

以上是关于使用 CodeIgniter Active Record 函数将子句添加到不带引号的 MySQL 语句的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter Active Record 与常规查询

使用 CodeIgniter 中的 Active Record 类从 4 个表中选择数据

Codeigniter Active Record使用多个主键选择多行

Codeigniter Active Record 类插入

Codeigniter Active Record 中的 Concat

动态 Active Record 查询中的 Codeigniter 括号