db内部循环查询

时间:2011-11-11 23:16:25

标签: php mysql codeigniter

我对foreach循环中的db查询有疑问。我正在为网站上的用户制作留言板。我存储" user_id"," owner_id" "消息"在db表"留言簿"。并循环浏览它们以显示页面上的帖子。但是在那个循环中我得到了#34;用户名"在"用户"通过直接调用whois_model来表达id = user_id的表。

<?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 个答案:

答案 0 :(得分: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();

请记住,视图应仅用于显示信息;你不应该在视图中从数据库中获取任何东西(例如:通过另一个模型)。

答案 1 :(得分: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

答案 2 :(得分:1)

您不应将用户名存储在留言簿表中。相反,当您对留言簿条目进行查询时,请在user_id上加入用户表(无论表支持您的whois模型),以便您在单个查询中获取留言簿中的所有信息和用户名。在查询中检索记录的内容如下:

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