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.id
每uf.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 中的 SQL 注释?