2012-04-06 57 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