@ShadowCross:
I originally tried your example of:
[code]
$this->paginate('Like', array(
'contain' => array('User'),
'conditions' => array(
'Like.count >' => 0
),
'order' => array(
'Like.count' => 'desc',
'Like.modified' => 'asc'
)
);
[/code]
The problem I faced there is that User $hasMany Like, not $hasOne.
Using the single record containing "Like.count" was an afterthought to
be able to order my results from greatest to least (that is all it's
used for and to be honest I would much rather not do it that way). For
each "like" two things happen, a new record is created for the "like"
and the record containing "count" is incremented by one. With using
$hasMany and containable Like ... in the view I loop through the array
and if in_array('your session id, $user['Like']), you like that user.
Also count($user['Like']) ... how many times that user is "liked."
I could actually switch to $hasOne without creating much of an issue
in other areas of the app but then I lose the array of "likes" for
each user as I loop through the set. Looks like I have six of one,
half dozen of the other.
On Mar 31, 1:53 pm, ShadowCross <[email protected]> wrote:
> If I'm interpreting it correctly, you have a table 'likes' that has the
> following fields:
>
> user_id (unique, represents the user_id of the person who is liked)
> count (number of users who indicated that they like this user_id)
>
> so that Like belongsTo User, and conversely, User hasOne Like. Assuming that
> both User and Like have the same dataSource, have you tried:
>
> $this->paginate('User', array(
> 'contain' => array('Like'),
> 'conditions' => array(
> 'Like.count >' => 0
> ),
> 'order' => array(
> 'Like.count' => 'desc',
> 'Like.modified' => 'asc'
> )
> );
>
> instead of using Like::getMostLiked() then running individual queries for
> each user in the resulting array.
>
> Because User hasOne Like, the ContainableBehavior uses a LEFT JOIN between
> User and Like, so Like.count is in the scope of the SQL query, and you
> should be able to use it as part of the $options['order']. Or as an
> alternative, you can also try:
>
> $this->paginate('Like', array(
> 'contain' => array('User'),
> 'conditions' => array(
> 'Like.count >' => 0
> ),
> 'order' => array(
> 'Like.count' => 'desc',
> 'Like.modified' => 'asc'
> )
> );
>
> Either one should work, since there's a one-to-one relation between the two
> models. And since only one SQL query is executed (instead of 1 + $limit,
> because you currently run 1 SQL query for Like::getMostLiked, and then
> individual queries for each of the user_id values), it should be a little
> faster and less resource-intensive.
--
Our newest site for the community: CakePHP Video Tutorials
http://tv.cakephp.org
Check out the new CakePHP Questions site http://ask.cakephp.org and help others
with their CakePHP related questions.
To unsubscribe from this group, send email to
[email protected] For more options, visit this group at
http://groups.google.com/group/cake-php