2011-01-08 3 views
2

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

До сих пор весь мой вызов db был в моем контроллере (это будет изменение).

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 = идентификатор текущего пластинки. и отобразите его рядом с пиктограммой комментариев.

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

Билли

UPDATE

Контроллер:

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

ответ

3

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

Я вообще встраивать их в массиве Многоуровневого в модели, как так ...

Примечание. Эта модель возвращает сообщение или все сообщения, в комплекте с массивом связанных комментариев, доступных через свойство ->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($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->, которые представляют собой просто массив комментариев, связанных с этим сообщением, поэтому knowi что вы можете вызвать 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 

EDIT: Я добавил необязательный параметр $id к методу модели, так что если вы хотите, вы можете указать один пост, если хотите, передав его id методу. Таким образом, этот же метод модели можно повторно использовать для отображения отдельных сообщений в деталях, а также отображаемых комментариев.

+0

@ jondavidjohn: Я удалил свой первоначальный ответ, поскольку ваш более всеобъемлющий и более в «духе» MVC, так сказать. Я согласен с тем, что OP должен определенно выбрать этот тип решения над «быстрым решением».«+1 за то, что потратили время, чтобы проиллюстрировать правильный подход. –

+0

Это похоже на то, что я хотел. Я дам это! – iamjonesy

+0

Я пробовал свой код. Похоже, он должен работать нормально. Все имена таблиц верны. Я назвал модель правильной. Добавил класс к модели, назовите модель правильно, но я получаю ошибку сервера при загрузке модуля. Имя модуля: city_model.php, вызывающий его с помощью модели $ this-> load-> ('City_model'); – iamjonesy

Смежные вопросы