CodeIgniter: отображение данных из двух таблиц в одном цикле - PullRequest
0 голосов
/ 17 апреля 2011

Допустим, у меня есть две таблицы базы данных:

blog     comments
-------  ----------
blog_id  comment_id
title    blog_id
content  comment

Теперь Я хотел бы просмотреть 3 последние записи в блоге и отобразить заголовок, содержимое и количествокомментарии к этой записи.

Для этого я создал Blog_model :

function get_entries($n)
{
    if ($n < 1) {$n = 1;}

    $this->db->order_by("blog_id", "desc"); 
    $q = $this->db->get('blog', $n);

    if($q->num_rows() > 0) 
    {
        foreach ($q->result() as $row) 
        {
            $data[] = $row;
        }
        return $data;
    }
}

Модель загружается в контроллер и передаетсяна просмотр:

$this->load->model('Blog_model');
$data['blog_rows'] = $this->Blog_model->get_entries(3);
$this->load->view('blog_view');

Это дает мне три последние записи в блоге.Теперь я могу перебирать строки и отображать содержимое в представлении следующим образом:

<?php foreach ($blog_rows as $row): ?>

<h2><?=$row->title;?></h2>
<a href="#" class="comments">12></a>
<p><?=$row->content;?></p>

<?php endforeach; ?>

Пока все хорошо.Но теперь сложная часть:

Я хотел бы отобразить количество комментариев, связанных с отображаемой записью в блоге.Как бы я этого достиг, придерживаясь практики CodeIgniter?

1 Ответ

1 голос
/ 17 апреля 2011

Вот два предложения для модельного метода: первый выполняет запрос для каждой строки блока, а второй выполняет уникальный запрос, который выполняется быстрее. второй запрос не проверен.

Модель 1

function get_entries($n)
{
    if ($n < 1) {$n = 1;}

    $this->db->order_by("blog_id", "desc"); 
    $q = $this->db->get('blog', $n);

    if($q->num_rows() > 0) 
    {
        foreach ($q->result() as $row) 
        {
            $data[] = $row;
        }
        return $data;
    }

    foreach($data AS &$blog_e)
    {
       $q = "SELECT COUNT(*) AS count FROM comments WHERE blog_id = ?";
       $query = $this->db->query($q,array($blog_e->blog_id);
       $ncomments = $query->result_array();
       $blog_e->n_comments = $ncomments[0]['count'];
    }
}

Модель 2

function get_entries($n)
{
    if ($n < 1) {$n = 1;}

    $q = "SELECT blog.blog_id,title,content,COUNT(comment_id) AS n_comments
          FROM blog JOIN comments ON blog.blog_id = comments.blog_id
          GROUP BY blog.blog_id,title,content
          ORDER BY blog.blog_id DESC
          LIMIT 0,?"

    $query = $this->db->query($q,array($n));

    if($query->num_rows() > 0) 
    {
        foreach ($q->result() as $row) 
        {
            $data[] = $row;
        }
        return $data;
    }
}

View

<?php foreach ($blog_rows as $row): ?>

<h2><?=$row->title;?></h2>
<a href="#" class="comments"><?=$row->n_comments?>></a>
<p><?=$row->content;?></p>

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