2011-11-11 85 views
1

我有一個關於在foreach循環內的db查詢的問題。我在網站上爲用戶製作留言簿。我在數據庫表「guestbook」中存儲「user_id」,「owner_id」「消息」。並通過它們循環顯示頁面上的帖子。但在該循環中,我通過直接調用whois_model來獲取id = user_id的「users」表中的「用戶名」。循環內的db查詢

<?php foreach ($records as $record) : ?> 
From: <?=anchor('profile/view/' . $record->user_id . '', $this->whois_model->_whois($record->user_id)); ?> 

<p><?=$record->message; ?></p> 
<?php endforeach; ?> 

將用戶名直接存儲在留言板表中還是有更好的方法避免運行多個查詢?

在此先感謝

喬治

回答

3

,除非你有一個很好的理由,不要非規範化數據。不僅你在浪費空間,而且如果你在records表中還有一個用戶名列,當用戶改變他們的名字時會發生什麼?

更好的方法是讓您的模型或控制器在您打算使用時自動檢索用戶名。這可以使用加入來完成,例如:

$this->db->select('username, message'); 
$this->db->from('guestbook'); 
$this->db->join('users', 'guestbook.user_id = users.user_id'); 

$query = $this->db->get(); 

請記住,該視圖只能用於顯示信息;你不應該在視圖中從數據庫中獲取任何東西(例如:通過另一個模型)。

+0

Oh ofcourse!加入!不知道爲什麼我沒有想到:/謝謝你的幫助。你是第一個如此投票給你的人。謝謝所有:) – georgesamper

1

將用戶名存儲在單獨的表中可以很好,您可以使用JOIN在同一查詢中獲取實際用戶名,而無需運行多個用戶名。

例如:

SELECT `messages`.`user_id`, `messages`.`owner_id`, `messages`.`message`, `users`.`username` FROM `messages` 
INNER JOIN `users` ON (messages.user_id = users.id) 
WHERE (clause) 
ORDER BY (clause) 

join更多的信息和例子。

1

您不應將用戶名存儲在留言簿表中。相反,當您對留言條目進行查詢時,請在user_id上加入用戶表(無論表是否支持您的whois模式),以便在單個查詢中找回留言簿中的所有信息和用戶名。在您的查詢中找到類似這樣的內容以檢索記錄:

... 
$this->db->select('*'); 
$this->db->from('guestbook'); 
$this->db->join('users', 'users.user_id = guestbook.user_id'); 
...