CodeIgniter Active Record 中的 SQL 注释?

Posted

技术标签:

【中文标题】CodeIgniter Active Record 中的 SQL 注释?【英文标题】:SQL Comment in CodeIgniter Active Record? 【发布时间】:2012-11-01 12:00:12 【问题描述】:

我正在将一个项目移动到 CodeIgniter 并希望利用 Active Record。但是,我还没有找到将 SQL 注释附加到查询的方法。在现有代码中,查询看起来像这样:

UPDATE table
SET column = 'value'
WHERE  ID = passed value;
-- Transacted by ' .$_SESSION['Name']

我搜索了 Google 和 SO,但没有找到如何添加最后一条“交易者”评论的答案,而无需直接编码整个内容并使用 $this->db->query('.....')

【问题讨论】:

Active Record 究竟有哪些优势?为什么不使用 db->query() 编写清晰的 SQL 查询代码? SQL 是关系数据库引擎之上的抽象层。 Active Record 是那个抽象层之上的一个抽象层?然后你可以添加你需要的所有评论,真正的数据库专家可以真正阅读你的查询并帮助你。当您可以在 php 中注释 Active Record 构造本身时,为什么还要将 cmets 插入 Active Record 查询?数据库会对这些 cmets 做些什么吗? @PatrickSavalle,这些 cmets 是为 DBA 准备的,他们设置了审计以获取这些。我不知道为什么 cmets 而不是插入到表格中,但我的不是原因,我的原因是 do and die()。 :) 至于为什么要使用 Active Record,它确实减少了实现所需的代码。此外,我被告知要做 AR(见上面的双关语)。 【参考方案1】:

我认为这在 ActiveRecord 中是不可能的,因为 AR 的功能有点受限。一种可行的选择是为您的“where”子句使用自定义字符串,并将您的交易注释粘贴在自定义“where”字符串的末尾。我自己没有测试过。

即使您必须手动进行查询,CI 也提供了一些不错的转义函数($this->db->escape 用于数字,$this->db->escape_str 用于 'where' 字符串,$this->db->escape_like_str 用于 'where like' 字符串)应该让您自己创建查询安全 - 我知道在大多数更复杂的 CI 应用程序中,由于 AR 的限制,我需要为大约 1/5 的查询编写自定义查询。

【讨论】:

【参考方案2】:

感谢 Darrrrrren 让我走上正轨。

我在控制器中定义了一个变量,如下所示: $this->sqlStamp = ' /* Executed by ' .strtoupper( $this->router->class .'->' .$this->router->method) .' for ' .strtoupper( $this->session->userdata('displayName') ) .'*/ ';

对于更新和删除,我能够添加 ->where('1=1'.$this->sqlStamp, NULL, false)

我无法为 Inserts 找到解决方案,因为它们没有 where 语句,并且尝试将 cmets 注入其他地方似乎不起作用。我最终在插入之前运行了这个,以便为 DBA 提供一些需要寻找的东西: $this->db->get_where('Same_TableName','0=1'.$this->sqlStamp);

【讨论】:

以上是关于CodeIgniter Active Record 中的 SQL 注释?的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter Active Record 类插入

使用 CodeIgniter Active Record 语句

CodeIgniter Active Record 与常规查询

CodeIgniter Active Record 中的 SQL 注释?

动态 Active Record 查询中的 Codeigniter 括号

Where 子句 CodeIgniter 中的 Active Record 问题