我对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; ?>
将用户名直接存储在留言簿表中是否更好,还是有更好的方法可以避免运行多个查询?
提前致谢
乔治
答案 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');
...