1 回答

TA贡献1788条经验 获得超4个赞
会有一些人会建议您进行单独的查询并合并结果集,因为这会减少脚本卷积。
会有其他人赞成使用 UNION ALL 来组合两个表查询,因为他们更喜欢单次访问数据库或者你不需要在第一次 SELECT 之后为列添加别名(对于列名的情况不同)。
我会满足您的要求,但要明白满足您的要求的方法不止一种。
CodeIgniter 目前不提供 UNION 方法,因此您可以对活动记录做的最好(AFAIK)是编译两个 SELECT 查询并在调用内部执行 UNION query()。
实际呈现的查询和结果集可能会略有不同,具体取决于您的数据库适配器——这种多功能性是 CodeIgniter 查询构建方法的一个特性。
我包括一个额外的列 ( source),以便您可以在显示数据时做出明智的决定(关于超链接等)。否则,您可能会引用一个id值但不知道它id引用的是哪个表。
代码:
$this->db->select($this->db->escape('v_grants') . ' AS source, id, title, type');
$this->db->from('v_grants');
$this->db->like('title', $keyword);
$this->db->or_like('open_to', $keyword);
$vGrantsQuery = $this->db->get_compiled_select();
$this->db->select($this->db->escape('art') . ', id, title, type');
$this->db->from('art');
$this->db->like('title', $keyword);
$this->db->or_like('open_to', $keyword);
$artQuery = $this->db->get_compiled_select();
/*
var_export([
$this->db->query($vGrantsQuery . ' UNION ALL ' . $artQuery)->result(),
$this->db->last_query()
]);
*/
return $this->db->query($vGrantsQuery . ' UNION ALL ' . $artQuery)->result();
ps Model 方法result()将生成一个空数组或一个对象数组。在您看来,您不需要count();只需检查if (!$result) {——这将告诉您结果集是否为空。
- 1 回答
- 0 关注
- 74 浏览
添加回答
举报