UserAyeJay
UserAyeJay

Reputation: 69

Codeigniter/PHP - Displaying results of two related queries in same view, blog app

I am new to both PHP and the Codeigniter(v2.0) framework. Hoping you can help me find my way through my first webapp. Details below, and thank you in advance!

Goal/Issue Summary: I would like to display within my view all blog_Comments that are attached to each paticular blog_Post.

Details: My blog_Posts table contains all original blog posts [id(int), title, entry, author (all varchar), and date(timestamp)]. My blog_Comments table[id(int), entry_id(int), author, comment(varchar)] contains all comments; they are associated with the original blog_Post via the *entry_id* attribute.

Controller:

$query1 = $this->blog_model->get_posts();
$query2 = $this->blog_model->get_comments();
$data = array();
$data['posts'] = $query1;
$data['comments'] = $query2;

Model:

function get_posts() {
$query = this->db->get('blog_Posts');
return $query->result;
}

function get_comments() {
$query = this->db->get('blog_Comments');
return $query->result;}

View:

<?php if(isset($posts)) : foreach($posts as $posts=>$row) : ?>
     <?php $row->title; ?>
     <?php $row->author; ?>
     <?php $row->entry; ?>

<?php foreach($comments as $comments=>$com) : ?>
    <?php if($com->entry_id == $row->id) : ?>
        <p>author: <?php echo $com->author; ?></p>
        <p>comment: <?php echo $com->comment; ?></p>
    <?php endif; ?>
<?php endforeach; ?>

<?php endforeach; ?>
<?php else : ?> <p>no blog_Posts found</p>
<?php endif; ?>

Edit/Update:

My attempt to display the comments is pasted into the view code block above, I've also listed the two issues it is giving me. Right now I have 2 sample original blog posts, and comments associated with each.

Issues:

  1. the first blog entry (first time through the loop) it is displaying ALL comments, including those associated with other entry_id s.
  2. The second blog entry (second time through loop), it throws the following error: "Invalid argument supplied for foreach()", and points to the line in my view containing the foreach for $comments.

In short, I'm trying to loo through only those comments with the entry_id that matches the original posts "id."

Thanks again for your assistance and time.

-AJ

Upvotes: 0

Views: 1890

Answers (2)

mallix
mallix

Reputation: 1429

Well since you do not need to display all comments at once, you could just alter your get_comments function like below to return comments for each post and of course display them in your way, order by date created, last entry etc:

So for the model part:

function get_comments($post_id){
$query = $this->db->query("select * from `blog_Comments` where `entry_id` = $post_id ORDER BY `created_on` DESC");

  if($query->num_rows() != 0){
   return $query->result();
 }else{
   return false;
 }
}

And in your view file:

foreach($posts as $row){
 echo 'Title: ' . $row->title .
 'Author: ' . $row->author .
 'Entry:' . $row->entry;
 $comments = $this->blog_model->get_comments($row->id);
 if(!$comments){ 
  echo 'No comments'; 
 }else{
  foreach($comments as $com){
    echo $com->comments . '<br/>' . $com->user . '<br/>' . etc etc
  }
 }
}

Upvotes: 2

cartalot
cartalot

Reputation: 3148

I'm too lazy to test, but i think you are trying to use $row, but you are outside the foreach where its defined. you introduce $row here

 <?php if(isset($posts)) : foreach($posts as $posts=>$row) : ?>

and then you close the foreach -- so $row is no longer available down here:

   <?php if($com->entry_id == $row->id); ?>

so yeah. but really you should be doing as much logic and checking as you can in the controller and model. verify your data objects - like Posts - THEN the controller determines the correct view. so then if there aren't any posts to show -- you dont have messy 'what if there are no posts' conditionals in your view. you just call the no posts view file.

Upvotes: 0

Related Questions