2011-11-11 12 views
1

foreachループ内でdbクエリに関する質問があります。私はサイト上のユーザーのゲストブックを作っています。私は "user_id"、 "owner_id" "メッセージ" dbテーブル "ゲストブック"に格納します。そしてそれらをループしてページに投稿を表示します。しかし、そのループでは、whois_modelを直接呼び出してid = user_idの "users"テーブルに "username"を取得します。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

ああもちろん! JOIN!なぜ私はそれを考えなかったのか分からない:/助けをありがとう。あなたは最初にそのように投票されました。皆さんありがとう :) – 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のuserテーブルにあるユーザテーブル(whoisモデルをサポートしているテーブル)に参加して、ゲストブックのすべての情報とユーザ名を単一のクエリで返すようにします。あなたのクエリでレコードを取得するためにこれを好きなもの:

... 
$this->db->select('*'); 
$this->db->from('guestbook'); 
$this->db->join('users', 'users.user_id = guestbook.user_id'); 
... 
関連する問題