CodeIgniter Active Record 查询 WITH/ 子查询

Posted

技术标签:

【中文标题】CodeIgniter Active Record 查询 WITH/ 子查询【英文标题】:CodeIgniter Active Record Queries W/ Sub Queries 【发布时间】:2012-04-17 09:30:39 【问题描述】:

问题:

我真的想坚持使用 ActiveRecord 而不是直接使用 SQL。有人可以帮我将其转换为 activerecord 吗?

试图从另一个表中获取电子邮件地址和联系人姓名。 map_userfields 表是一个一对多的,每个 p.id 的多行。每p.iduf.fieldid 一行。

查看此屏幕截图以获取对 map_userfields 表的引用:

当前非活动记录查询

SELECT
p.id,
(SELECT uf.fieldvalue FROM map_userfields uf WHERE uf.pointid = p.id AND uf.fieldid = 20) As ContactName,
(SELECT uf.fieldvalue FROM map_userfields uf WHERE uf.pointid = p.id AND uf.fieldid = 31) As ContactEmail
FROM
map_points p
WHERE
/** $pointCategory is an array of categories to look for **/
p.type IN($pointCategory)

注意:我使用的是 CodeIgniter 2.1.x、mysql 5.x、php 5.3

【问题讨论】:

【参考方案1】:

子查询确实可以在 codeigniter 中使用,但有一点小技巧。我发现在 system/database/DB_active_rec.php 中有两个函数名为 _compile_select 和 _reset_select。如果您从两者中删除受保护的词,您将能够将这些功能用于子查询 这是一个使用教程

http://heybigname.com/2009/09/18/using-code-igniters-active-record-class-to-create-subqueries/

【讨论】:

【参考方案2】:

CodeIgniter 的 Active Record 不支持开箱即用的子查询。您需要下载CodeIgniter Subqueries class。

在 CodeIgniter wiki 中,有一个 article on how to subqueries。

【讨论】:

【参考方案3】:

您可以使用 CI 的 activeRecords 选择您需要的任何内容,只要您告诉 CI 不要解析您的字符串

$this->db->select('p.id,
(SELECT uf.fieldvalue FROM map_userfields uf WHERE uf.pointid = p.id AND uf.fieldid = 20) As ContactName,
(SELECT uf.fieldvalue FROM map_userfields uf WHERE uf.pointid = p.id AND uf.fieldid = 31) As ContactEmail
',TRUE);
$this->db->from('map_points p');
$this->db->where_in('p.type',$pointCategory);
$q = $this->db->get();

【讨论】:

谢谢,有没有办法避免这种情况?或者这是否被认为是可用的最佳实践?

以上是关于CodeIgniter Active Record 查询 WITH/ 子查询的主要内容,如果未能解决你的问题,请参考以下文章

Codeigniter Active Record 类插入

使用 CodeIgniter Active Record 语句

CodeIgniter Active Record 与常规查询

CodeIgniter Active Record 中的 SQL 注释?

动态 Active Record 查询中的 Codeigniter 括号

Where 子句 CodeIgniter 中的 Active Record 问题