使用 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使用多个主键选择多行