2013-10-23 31 views
0

當我使用CI的活動記錄執行聯接時,有時結果不會顯示所有字段。例如,當使用具有相同字段名稱的表執行聯接時,表格字段中的一個字段不會顯示在結果中。codeigniter活動記錄:執行聯接時丟失的字段

實施例:

=== TABLE users === 
id INT(10) 
first_name VARCHAR(255) 
last_name VARCHAR(255) 

=== TABLE messages === 
id INT(10) 
exp_id INT(10) 
dest_id INT(10) 
content TEXT 

=== CONTENT OF THE DATABASE === 
INSERT INTO users VALUES (1, "Bob", "Smith"); 
INSERT INTO users VALUES (2, "Graig", "Anderson"); 
INSERT INTO messages VALUES (999, 1, 2, "Hello Graig!"); 

=== the query === 
$this->db->where('messages.id', 999); 
$this->db->join('users exp', 'users.id=messages.exp_id', 'INNER'); 
$this->db->join('users dest', 'users.id=messages.dest_id', 'INNER'); 
$res = $this->db->get('messages'); 

== the result === 
id  exp_id dest_id content   first_name last_name 
999  1  2  Hello Graig! Bob   Smith 

我不能retreive既有 「dest.first_name」 和 「dest.first_name」。表「dest」位於join()中,但與表「exp」存在衝突,該表也具有「first_name」和「last_name」字段。事實上,這不是一個CI問題,這是MySQL的行爲。

它可以使用select/aliases修復,但是有沒有辦法使optionn將一個連接表的別名附加(或前置)到它的字段?因此,其結果可能是這樣的:

id  exp_id dest_id content   id_exp first_name_exp last_name_exp id_dest first_name_dest last_name_dest 
999  1  2  Hello Graig! 1  Bob    Smith   2  Graig   Anderson 

回答

3

「時,與具有相同的字段名稱表進行了連接,表的字段的一個不會在搜索結果中。」

正是你的問題,這是任何db &而不是codeigniter的標準sql。即使您使用「SELECT * ...」,字段名稱的最後一個實例也始終是所選的一個實例。

簡而言之,不,在CI中沒有這樣的功能。按照您的建議使用別名是解決方案;使它你會涉及擴展核心數據庫驅動程序類,我猜測是遠遠更多的工作比你感興趣的

使用ORM可能會解決這個問題,但我不認爲這本身就足以做到這一點

1

我也有同樣的錯誤。我覺得這個問題的解決方案:

 === the query === 
    $this->db->select('messages.*'); 
    $this->db->select('exp.id as exp_id, exp.firstname as exp_firstname, exp.lastname as exp_lastname'); 
    $this->db->select('dest.id as dest_id, dest.firstname as dest_firstname, dest.lastname as dest_lastname'); 
    $this->db->where('messages.id', 999); 
    $this->db->join('users as exp', 'users.id=messages.exp_id', 'INNER'); 
    $this->db->join('users as dest', 'users.id=messages.dest_id', 'INNER'); 
    $res = $this->db->get('messages'); 

所以結果看起來是這樣的:

id exp_id dest_id content  exp_id exp_firstname exp_lastname dest_id dest_firstname  dest_lastname 
999  1  2  Hello Graig! 1  Bob    Smith   2   Graig    Anderson