БД запросов внутри цикла - PullRequest
1 голос
/ 12 ноября 2011

У меня есть вопрос, касающийся запросов в базе данных внутри цикла foreach.Я делаю гостевую книгу для пользователей на сайте.я храню "user_id", "owner_id" "message" в таблице базы данных "guestbook".И переберите их, чтобы отобразить сообщения на странице.Но в этом цикле я получаю «username» в таблице «users», где id = user_id, напрямую вызывая whois_model.

<?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; ?>

Лучше хранить имя пользователя в таблице guestbook напрямую илиесть лучший подход, чтобы избежать выполнения нескольких запросов?

Заранее спасибо

Джордж

Ответы [ 3 ]

3 голосов
/ 12 ноября 2011

Не денормализуйте свои данные, если у вас нет веских причин для этого.Не только вы теряете пространство, но и если у вас есть столбец имени пользователя в таблице 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 голос
/ 12 ноября 2011

Вы не должны хранить имя пользователя в таблице гостевой книги.Вместо этого, когда вы делаете запрос для записей гостевой книги, присоединитесь к пользовательской таблице (независимо от того, какая таблица поддерживает вашу модель whois) в user_id, чтобы вы вернули всю информацию в гостевой книге и имя пользователя в одном запросе.Примерно так в вашем запросе для получения записей:

 ...
 $this->db->select('*');
 $this->db->from('guestbook');
 $this->db->join('users', 'users.user_id = guestbook.user_id');
 ...
1 голос
/ 12 ноября 2011

Нормально хранить имя пользователя в отдельной таблице, вы можете использовать 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)

См. присоединиться для получения дополнительной информации и примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...