2012-04-06 49 views
14

我正在构建一个涉及JOIN的查询。这是我第一次用Active Record完成数据库的工作,并且遇到了一些问题。JOIN语句中的CodeIgniter ActiveRecord字段名称

我想加入的表中调用companiesusers表,所以我可以得到公司等用户中的名字,我已经做了这种成功,像这样:

function get_profile_by_username($username) 
{ 
    $this->db->join('companies', $this->table_name.'.company_id = companies.id'); 
    $this->db->where('LOWER(username)=', strtolower($username)); 
    $query = $this->db->get($this->table_name); 
    if ($query->num_rows() == 1) return $query->row(); 
    return NULL; 
} 

然而问题是companies中的字段是idname,它们在该对象中返回,简称为name

正常情况下,当我要写原始查询时,我会给这些表提供别名,结果将类似u.company_id,c.name。所以我知道name与用户无关,但当然是公司的名称。虽然现在不是一个问题,但可能在将来,id列显然不能共存于结果集中,所以会被覆盖!

我们如何才能区分来自某些表格的字段?或者有没有更好的方式去处理表连接和使用连接的查询数据集/对象?

编辑:

如果我是这样做的原始查询我会怎么做:

SELECT u.id, u.username, c.name 
FROM users AS u 
JOIN companies AS c 
ON c.id = u.company_id 
WHERE u.username = 'foobar'; 

这是伟大的,但如果我这样做,在活动记录我认为这是实践中相当差,如果它工作的话。

回答

36

如果要从表中选择某些特定列,请使用db->select()。您可以为表格添加别名,添加一些条件等。发送第二个参数FALSE不能转义特殊字符。

$this->db->select('u.id, u.username, c.name', false); 
$this->db->from('user as u'); 
$this->db->join('companies as c', 'u.company_id = c.id'); 
$this->db->where('LOWER(u.username)=', strtolower('foobar')); 
$query = $this->db->get(); 
+0

我想我可能不得不诉诸这一点,但我并不确定自己能够选择那样。我如何给我的例子表格添加别名,比如' - > get('user AS u')'?这是否与所有activerecord数据库目标兼容? – deed02392 2012-04-06 20:46:04

+0

@ deed02392检查,更新代码 – safarov 2012-04-06 20:54:26

+0

好吧,就像我想的那样。 'AS'运算符是标准的SQL权限,它在所有db语言中设置别名?或者这只能在certiain db中工作。 – deed02392 2012-04-07 11:35:06