2011-07-06 91 views
1

在Model類中,我使用return $query->row();返回多行,並返回多行時返回return $query->result();Codeigniter返回結果和行

在單個頁面上,我必須從2個獨立的表中返回單行和多行。

users包含一般信息,如用戶名,全名和電子郵件地址。 表user_links包含由相應用戶提交的鏈接,並且每個用戶有多行。

我查詢

 $this->db->select('*'); 
     $this->db->from('users'); 
     $this->db->join('user_links', "user_links.user_id = users.user_id"); 
     $this->db->where('users.user_id', $user_id); 
     $this->db->where('user_links.user_id', $user_id); 
     $query = $this->db->get(); 
     return $query->row(); 

在我的控制器由我

$data['row'] = $this->User_model->user_read($user_id);加載在我看來,查詢,

$user_id是包含唯一用戶ID的第三個URL段。

最後,在我看來,我檢索由echo $row->first_name;

行這適用於單行,但我怎麼可以創建一個foreach循環用戶鏈接?目標是避免單行的循環,並將它們用於檢索多行。

回答

2

如果我正確理解你的問題,你想將用戶數據和user_links數據同時用單個查詢同時避免迭代獲取用戶數據。雖然這可能會使用result_array,但我會建議您不要這樣做,因爲當user_links中沒有特定用戶的條目時,您將得到0結果。

我的建議是,您使用兩個查詢,一個從用戶表中獲取用戶,另一個從user_links表中獲取用戶的鏈接。這也將幫助您避免連接。

+0

謝謝!我之前使用2個查詢,並從控制器發送兩個查看,但聯接似乎更專業。 – CyberJunkie

1

很難說出你想要的。

您需要一個函數來檢查您是否傳遞row()result()並相應地對待它們。

在我看來,如果您將所有內容都作爲result()傳遞給您,您的代碼將更易於閱讀(並保持)。並檢查一下是否爲空,向用戶顯示一條好消息。

1

聽起來你正在尋找一些已經通過CI的活動記錄提供的其他功能:http://codeigniter.com/user_guide/database/results.html

對於你在做什麼,它聽起來就像使用內置的功能result_array會工作。您可以使用它,像這樣:

取自上面的鏈接

$query = $this->db->query("YOUR QUERY"); 

foreach ($query->result_array() as $row) 
{ 
    echo $row['title']; 
    echo $row['name']; 
    echo $row['body']; 
} 
+0

感謝您的建議!不是'result_array'與從模型中返回'result()'相同嗎?對象格式看起來比純數組更清晰。 – CyberJunkie

+0

是的,只有數組格式纔是相同的東西。我一定誤解了你真正想問的問題。你能澄清一下你想要的嗎? – Obto

+0

我想從我的模型中返回'row()'和'result()'到控制器來查看並在視圖中使用'echo $ row-> some_value;'從數據庫檢索數據,或者通過1行創建循環'result()'函數 – CyberJunkie

5

這是僞代碼,但你可以probobly做這樣的事情

$this->db->select('*'); 
    $this->db->from('users'); 
    $this->db->join('user_links', "user_links.user_id = users.user_id"); 
    $this->db->where('users.user_id', $user_id); 
    $this->db->where('user_links.user_id', $user_id); 
    $query = $this->db->get(); 
    if ($query->num_rows() == 1) 
    { 
     return $query->row(); 
    } 
    elseif ($query->num_rows() > 1) 
    { 
     return $query->result_array(); //This returns an array of results which you can whatever you need with it 
    } 
    else 
    { 
     //Add some logic to handle if there are zero results 
    } 
+0

行對於一個表等於1且對於其他表等於1並且對於其他表而言多行1​​,所以將表連接起來,我將不得不返回row()和result()。我認爲如果陳述應該添加在視圖中。 – CyberJunkie

+0

我不能理解你的問題,但我認爲避免if視圖中的語句並在控制器或模型中處理它們是一種很好的做法。 – Odnxe

+0

謝謝Odnxe! +1表示建議。我會研究在我的模型中實現if語句,看看它是否更好。 :) – CyberJunkie

0

只需更換這行:

$this->db->join('user_links', "user_links.user_id = users.user_id"); 

有了這一個:

$this->db->join('user_links', "user_links.user_id = users.user_id", 'left outer'); 

加盟笨默認,但在某些情況下使用INNER JOIN如果在user_links沒有數據就沒有返回值所以你可以在你的框架工作CI中使用LEFT JOIN,就像我上面提到的那樣。