2014-01-10 41 views
1

問題摘要: 我正在使用CodeIgniter的Active Record Class從3個表中進行連接。所有3個表都有'ID'作爲主鍵。我如何獲得正確的ID輸出?我試圖找出如何在select語句中做一個別名,但無法使其工作。CodeIgniter SELECT with 2 JOINS - 如何獲得正確的ID

的代碼:

(控制器)

public function index() 
{ 
$data['call_reports'] = $this->call_reports_model->get_call_reports(); 
$data['title'] = 'All Call Reports'; 
$this->load->view('call_reports/templates/header', $data); 
$this->load->view('call_reports/index', $data); 
$this->load->view('call_reports/templates/footer'); 
} 

(型號)

public function get_call_reports() 
{ 
$this->db->select('*'); 
$this->db->from('call_reports'); 
$this->db->join('employees', 'employees.ID=call_reports.employee_ID'); 
$this->db->join('customers', 'customers.ID=call_reports.customer_ID'); 
$query = $this->db->get(); 
return $query->result_array(); 
} 

(指數)

<?php foreach($call_reports as $call_reports_item): ?> 
<p><?php echo $call_reports_item['name'] ?></p> <!—Result: name from employee table --> 
<p><?php echo $call_reports_item['CUSNM'] ?></p> <!—Result: name from customer table --> 
<?php echo $call_reports_item['ID'] ?> ***<!—RESULTS IN EMPLOYEE ID -->*** 
<?php endforeach ?> 

的問題行代碼:

<?php echo $call_reports_item['ID'] ?> ***<!—RESULTS IN EMPLOYEE ID -->*** 

我希望這是呼叫報告ID而不是僱員ID。我該如何解決?

在此先感謝您的幫助。

+1

您是否嘗試過使用'$ call_reports_item ['call_reports.ID']'?對數據庫中的每個主鍵使用「ID」名稱也是一個壞主意。 – Twister1002

+0

@ Twister1002我嘗試過使用'$ call_reports_item ['call_reports.ID']'結果如下:消息:未定義的索引:call_reports.ID – JoeKincognito

+0

'var_dump($ call_reports_item)';什麼東西在那裏? – Jessica

回答

1

這僅僅是標準的SQL:

$this->db->from('call_reports cr'); 

然後做你想做的變量選擇:

$this->db->select('cr.id, ...'); 

並且您將在結果中引用值爲cr.id。對於每個表只需添加一個別名後根據您的迴應它(保持簡單,像CR,E或C(顧客)。

享受

編輯
,你也可以使用method chaining降低使用$this->db->每行美中不足的是它使你的代碼的可讀性,但對於簡單的調用它就好了。

$this->db->select('cr.ID,cr.call_date,cr.objective,cr.comments,c.CBRCD,e.name,c.‌​CUSNM'); 
$this->db->from('call_reports cr')->join('employees e', 'e.ID=cr.employee_ID')->join('customers c', 'c.ID=cr.customer_ID'); 

我已經離開它在2線(能做到這一點:1) ,bu你明白了嗎?

+0

非常感謝,您的建議非常有幫助,我找到了解決方案。這就是我最終做的,它像一個魅力。感謝所有回覆的人。 '$ this-> db-> from('call_reports cr'); $ this-> db-> join('employees e','e.ID = cr.employee_ID'); $ this-> db-> join('customers c','c.ID = cr.customer_ID'); $ this-> db-> select('cr.ID,cr.call_date,cr.objective,cr.comments,c.CBRCD,e.name,c.CUSNM');' – JoeKincognito

+0

很高興幫助,我已經概述**方法鏈接**爲你,以及要記住的東西。 – Jakub

0

在您選擇嘗試:

$this->db->select('employees.*, customers.*, call_reports.*'); 

,然後使用:

$call_reports_item['call_reports.ID'] 
+0

問題在於您選擇的是不是真正需要的所有列。除非你只是做一個快速測試,否則不要使用'*'。 – Jakub

+0

發佈在原始帖子中的代碼示例選擇所有3個表中的所有字段。我的代碼是Joe試圖實現的等價代表。那麼,你怎麼知道不是所有的列都需要呢? – raj

+0

@raj你的建議等同於我想要做的事情,它可能會奏效。然而,Jakub在假設我不需要3個表中的所有字段時是正確的,所以我使用了別名,並使我的select語句特定於我所需的字段。謝謝你的文章。 – JoeKincognito