CodeIgniter: помогите с этим запросом - PullRequest
2 голосов
/ 08 января 2011

Я только что запустил свое первое приложение CI.У меня есть представление, которое отображает некоторые сообщения.Каждое сообщение может иметь несколько комментариев, и я хочу отобразить общее количество комментариев рядом с каждым сообщением.

Пока все мои вызовы в БД находятся в моем контроллере (будут меняться).

function index(){
    $data['query'] = $this->db->get('posts');
    $this->load->view('blog_view', $data);
}

На мой взгляд:

<?php foreach($query->result() as $row): 
      <div class="post-box">
          <p><?php echo $row->body; ?><small>&nbsp;added by <?php echo $row->username; ?> on  <?php echo date ('d/m/Y',strtotime($row->created)); ?>&nbsp;<a href="<?php echo base_url(); ?>blog/comments/<?php echo $row->id; ?>"><img src="<?php echo base_url(); ?>images/comments_icon.png" />&nbsp;0</a></small></p>
      </div>
<?php endforeach; ?>

Я хочу получить общее количество комментариев, где comment.post_id = идентификатор текущей записи.и отобразите его рядом со значком комментария.

Любая помощь с этим самым ценным,

Билли

ОБНОВЛЕНИЕ

Контроллер:

function index(){
    //load the model
    $this->load->model('City_model');

    //call the model method
    $data->posts = $this->City_model->get_posts();


    $this->load->view('blog_view', $data);
}

Модель (city_model.php):

<?php

class City_model extends Model{

    function get_posts($id = NULL) {

        //define optional id for single post
        //if an id was supplied
        if ( $id != NULL ) {
            $this->db->where('id',$id);
        }

        // execute query
        $query = $this->db->get('posts');

        //make sure results exist
        if($query->num_rows() > 0) {
            $posts = $query->result();
        } else {
            return FALSE;
        }

        //create array for appended (with comments) posts
        $appended_posts_array = array();

        //loop through each post
        foreach ($posts as $post) {

            //get comments associated with the post
            $this->db->where('post_id', $post->id)
            $comments = $this->db->get('comments');

            //if there are comments, add the comments to the post object
            if($comments->num_rows() > 0) {
                $post->comments = $comments;
            }
            else {
                $post->comments = array();
            }

            //rebuild the returned posts with their comments
            $appended_posts_array[] = $post;

        }

        //if post id supplied, only return the single post object
        if ($id != NULL) {
            return $appended_registration_array[0];
        }
        else {
            return $appended_registration_array;
        }
    }
}

1 Ответ

3 голосов
/ 08 января 2011

Вот пример метода модели, который использует подход, который я обычно применяю для Предметов, у которых есть «подэлементы» ...

Обычно я строю их в многоуровневом массиве в модели следующим образом:.

Примечание. Эта модель возвращает сообщение или все сообщения с массивом связанных комментариев, доступных через свойство ->comments.

function get_posts($id = NULL) {

    //define optional id for single post
    //if an id was supplied
    if ( $id != NULL ) {
        $this->db->where('id',$id);
    }

    // execute query
    $query = $this->db->get('posts');

    //make sure results exist
    if($query->num_rows() > 0) {
        $posts = $query->result();
    } else {
        return FALSE;
    }

    //create array for appended (with comments) posts
    $appended_posts_array = array();

    //loop through each post
    foreach ($posts as $post) {

        //get comments associated with the post
        $this->db->where('post_id', $post->id)
        $comments = $this->db->get('comments');

        //if there are comments, add the comments to the post object
        if($comments->num_rows() > 0) {
            $post->comments = $comments;
        }
        else {
            $post->comments = array();
        }

        //rebuild the returned posts with their comments
        $appended_posts_array[] = $post;

    }

    //if post id supplied, only return the single post object
    if ($id != NULL) {
        return $appended_registration_array[0];
    }
    else {
        return $appended_registration_array;
    }       
}

Сейчас вконтроллер ...

function posts() {

    //load the model
    $this->load->model('model_name');

    //call the model method
    $data->posts = $this->model_name->get_posts();

    //load the view
    $this->load->view('view/file', $data);

}

Затем в представлении вы можете использовать вложенный foreach для циклического просмотра постов и комментариев

<? foreach($posts as $post): ?>                //posts foreach start

    <h1><?= $post->title ?></h1>  //post title
    <p><?= $post->body ?></p>     //post body

    <? foreach($post->comments as $comment): ?>     //comments foreach start       
        <h3><?= $comment->author ?></h3>  //comment author
        <p><?= $comment->body ?></h3>     //comment body
    <? endforeach; ?>                               // end comments foreach

<? endforeach; ?>        // end posts foreach

Обратите внимание, что после создания массива постовкак я показал в модели, для каждого элемента $ post у вас есть $ post-> comments, который представляет собой просто массив комментариев, связанных с этим сообщением, поэтому, зная, что вы можете вызвать count($post->comments) в контроллере или представлениичтобы получить количество комментариев, относящихся к одному сообщению.

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

<? foreach($posts as $post): ?>                //posts foreach start

    <h1><?= $post->title ?></h1>             //post title
    <p><?= count($post->comments) ?></p>     //comment count


<? endforeach; ?>        // end posts foreach

РЕДАКТИРОВАТЬ: Я добавил необязательный параметр $id в метод модели, так что если вы хотите, вы можете указать один пост, если хотите, передаваяэто идентификатор метода.Таким образом, этот же метод модели можно повторно использовать для подробного отображения отдельных сообщений, а также отображения всех комментариев.

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