I am trying to extend the blog example where my Posts belong to Users and 
Posts has many comments and to get a  query where the comments are left 
joined into the query such that I can get a comment count for  each post 
for listing out in my index page.  

 According to the documentation, it should be able to work, but after 
trying nearly everything I could find in the documentation including 
changing recursive to 1 and using contain, the paginate call to find_all 
still refuses to include comments in the join list such that I get an error 
that the comments.id was not found.

When I get rid of the count, fields, and contain and set recursive to 1, it 
generates 2 separate queries, the first left joining the posts with the 
users,  the second querying the comments.


Is there something I am missing?

This is the Query I am expecting:

SELECT `Post`.`id`, `Post`.`user_id`, `Post`.`title`, `Post`.`post`, 
`User`.`id`, `User`.`role`, `User`.`username`, `User`.`password`, 
`User`.`email`, `User`.`Avatar`, `User`.`first_name`, `User`.`last_name`, 
`User`.`created`, COUNT(`Comment`.`id`) comments FROM `blog`.`Posts` AS 
`Post` LEFT JOIN `blog`.`Comments` AS `Comment` ON (`Comment`.`Post_id` = 
`Post`.`id`) LEFT JOIN `blog`.`users` AS `User` ON (`Post`.`user_id` = 
`User`.`id`) WHERE 1 = 1 GROUP BY `Comment`.`post_id`;

This is what is produced:
SELECT `Post`.`id`, `Post`.`user_id`, `Post`.`title`, `Post`.`post`, 
`User`.`id`, `User`.`role`, `User`.`username`, `User`.`password`, 
`User`.`email`, `User`.`Avatar`, `User`.`first_name`, `User`.`last_name`, 
`User`.`created`, COUNT(`Comment`.`id`) comments FROM `blog`.`Posts` AS 
`Post` LEFT JOIN `blog`.`users` AS `User` ON (`Post`.`user_id` = 
`User`.`id`) WHERE 1 = 1 GROUP BY `Comment`.`post_id`;

using this code:
        $this->Question->recursive = 1;
        $this->set('userId',    $this->Auth->user('id'));
        
        $this->Question->Behaviors->load('Containable', array('autoFields' 
=> false));
        
        $this->paginate =array(
                'fields' => array('Question.id', 'Question.user_id', 
'Question.title', 'Question.question',
                        'User.id', 'User.role', 'User.username', 
'User.password', 'User.email', 'User.Avatar',
                        'User.first_name', 'User.last_name', 
'User.created', 'COUNT(Comment.id)  answers'
                ),
                'group' => 'Comment.question_id',
                'contain' => array('User','Comment.id'));
        $this->set('questions', $this->paginate());

 
 Is the only way to get it to work without using my own SQL to specify all 
the fields and force the joins?
 Adding Joins to the options, I can force the join and it works like I 
want, but shouldn't it be able to figure out the joins by itself with the 
contain specifying the comment table?

Code for options with forced Join for the comments table:
        $this->paginate =array(
                'fields' => array('Question.id', 'Question.user_id', 
'Question.title', 'Question.question',
                        'User.id', 'User.role', 'User.username', 
'User.password', 'User.email', 'User.Avatar',
                        'User.first_name', 'User.last_name', 
'User.created', 'COUNT(Comment.id)  answers'
                ),
                'group' => 'Comment.question_id',
                'joins' => array(array(
                        'table'=>'Comments', 'alias'=>'Comment', 
'type'=>'LEFT',
                        'conditions'=>array('Comment.question_id = 
Question.id'))) ,
                'contain' => array('User','Comment.id'));

-- 
Like Us on FaceBook https://www.facebook.com/CakePHP
Find us on Twitter http://twitter.com/CakePHP

--- 
You received this message because you are subscribed to the Google Groups 
"CakePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to cake-php+unsubscr...@googlegroups.com.
To post to this group, send email to cake-php@googlegroups.com.
Visit this group at http://groups.google.com/group/cake-php?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.


Reply via email to