Wednesday, May 29, 2013

Re: containable problem

So embarrassing. In my long list of associations School->User  was missing? Your code worked thanks a bunch..

Robert


On Wed, May 29, 2013 at 3:22 PM, Robert Gravel <rockbust@gmail.com> wrote:
John thank you but it seems to not be working. I was mistaken that your code is the same as my second example.
I have pasted your code:
when I input a date range of may27 - may 29, I am returned all associated models and no filtering on the Attendance model.
You can see both Attendance records returned when only one should be.

SELECT `Attendance`.`id`, `Attendance`.`created`, `Attendance`.`modified`, `Attendance`.`user_id`, `Attendance`.`program_id`, `Attendance`.`school_id` FROM `attendances` AS `Attendance` WHERE `Attendance`.`school_id` = (2)
1] => Array          (              [User] => Array                  (                      [id] => 119                      [group_id] => 2                      [username] => mdonohue                      [role] =>                       [password] => 1234                      [email] => bla@mail.com                      [phone] => 631-252-5790                      [cell_phone] =>                       [active] => 1                      [first_name] => Mikey                      [last_name] => Donohue                      [country] =>                       [address] => 12324 any street                      [city] => anycity                      [state] => NY                      [zip_code] => 11739                      [created] => 2011-12-14 16:53:33                      [modified] => 2011-12-14 21:45:24                      [about_me] =>                       [household_id] => 2                      [is_head] => 1                      [birthdate] => 1968-01-16                      [activated] => 0                      [activation_code] =>                       [school_id] => 2                      [name] =>                       [uniform_size] => 5                      [barcode] => 9375361                      [show_profile] => 0                      [photo] =>                       [photo_dir] =>                       [lead_source] =>                   )                [Household] => Array                  (                      [id] => 2                      [name] => mikey donohue                      [payment_token] =>                       [payment_type] =>                       [school_id] => 2                  )                [Attendance] => Array                  (                      [0] => Array                          (                              [id] => 185                              [created] => 2013-05-27                              [modified] => 2013-05-29 03:34:40                              [user_id] => 119                              [program_id] => 3                              [school_id] => 2                          )                        [1] => Array                          (                              [id] => 186                              [created] => 2013-05-26                              [modified] => 2013-05-29 03:35:06                              [user_id] => 119                              [program_id] => 3                              [school_id] => 2                          )                    )                [Photo] => Array                  (                  )                [News] => Array                  (                  )                [Eventregistration] => Array                  (                  )                [Rankforuser] => Array                  (                      [0] => Array                          (                              [id] => 524                              [created] => 2013-05-28                              [modified] => 2013-05-28                              [user_id] => 119                              [rank_id] => 28                              [program_id] => 3                              [school_id] => 2                              [current_rank] => 1                          )                    )                [Testregistration] => Array                  (                  )                [Trial] => Array                  (                      [0] => Array                          (                              [id] => 32                              [date] => 2012-01-15 09:35:00                              [reminder] => 1                              [reminder_date] => 2011-12-31 09:35:00                              [message] =>                               [created] => 2011-12-15 09:37:20                              [modified] => 2011-12-15 09:49:08                              [template_id] => 7                              [staff_id] => 2                              [user_id] => 119                              [school_id] => 2                          )                    )                [Usermembership] => Array                  (                      [0] => Array                          (                              [id] => 314                              [start_date] => 2013-06-01                              [end_date] => 2015-06-01                              [created] => 2013-05-28 19:35:19                              [modified] => 2013-05-28 19:35:19                              [status] => 1                              [user_id] => 119                              [program_id] => 3                              [school_id] => 2                              [downpayment] => 199                              [downpayment_due] => 2013-06-01                              [installment_number] => 24                              [installment_payment] => 150                              [installment_date] => 2013-06-01                              [total_due] => 3900                          )                    )                [Bill] => Array                  (                      [0] => Array                          (                              [id] => 1912                              [due_date] => 2013-06-01                              [description] => Membership 1/24                              [auto_pay] => 1                              [amount] => 150                              [amount_paid] => 0                              [payment_type] =>                               [payment_date] => 0000-00-00 00:00:00                              [payment_status] => 0                              [created] => 2013-05-28 19:35:19                              [user_id] => 119                              [school_id] => 2                              [eventregistration_id] => 0                              [testregistration_id] => 0                              [usermembership_id] => 314                          )  If I do not apply the conditions to the User model the containable and date work correctly but it returns all users with other school_id's

  [4] => Array ( [User] => Array ( [id] => 119 [group_id] => 2 [username] => mdonohue [role] => [password] => 1234 [email] => bla@mail.com [phone] => 631-252-5790 [cell_phone] => [active] => 1 [first_name] => Mikey [last_name] => Donohue [country] => [address] => 12324 any street [city] => anycity [state] => NY [zip_code] => 11739 [created] => 2011-12-14 16:53:33 [modified] => 2011-12-14 21:45:24 [about_me] => [household_id] => 2 [is_head] => 1 [birthdate] => 1968-01-16 [activated] => 0 [activation_code] => [school_id] => 2 [name] => [uniform_size] => 5 [barcode] => 9375361 [show_profile] => 0 [photo] => [photo_dir] => [lead_source] => ) [Attendance] => Array ( [0] => Array ( [id] => 185 [created] => 2013-05-27 [modified] => 2013-05-29 03:34:40 [user_id] => 119 [program_id] => 3 [school_id] => 2 ) ) [Usermembership] => Array ( [0] => Array ( [id] => 314 [start_date] => 2013-06-01 [end_date] => 2015-06-01 [created] => 2013-05-28 19:35:19 [modified] => 2013-05-28 19:35:19 [status] => 1 [user_id] => 119 [program_id] => 3 [school_id] => 2 [downpayment] => 199 [downpayment_due] => 2013-06-01 [installment_number] => 24 [installment_payment] => 150 [installment_date] => 2013-06-01 [total_due] => 3900 ) ) )





On Wed, May 29, 2013 at 2:27 PM, John <spiliot@gmail.com> wrote:
Are you sure you tried the code I proposed in my second message? If yes what is the error message or returned output like?

Your first example in the first message is different to what I wrote. What you were doing is to find all users then use their IDs to return results from the other tables (this is how contain works). First you asked containable to apply it to Attendance then on Usermembership and finally to the User model which would need User to be connected to the User model. This of course is not the case, it was failing and it was telling you why.


$this->User->find('all',
  array('contain' => array(
    'Attendance' => array(
      'conditions' => $cond
    ),
    'Usermembership',
    'User' => array(
      'conditions' => $cond2)
    )
  )
);

On your second example you are using Model::find wrong. It is defined as find(string $type = 'first', array $params = array()) (notice only two parameters) but you called it as find('all', array(<whatever>), array(<whatever)).  Of course it fails with three parameters (PHP should be telling you that).

My code is telling cake to
1. Get the proper filtered users as 'conditions' => cond2 are applied to the User model
2. Use the IDs of those users to return "contained" data from the other associated models ('contain' => ...)

If this is failing then your models are probably not properly associated or I'm overlooking something.



On Wed, May 29, 2013 at 11:35 AM, John <spi...@gmail.com> wrote:
What are your model associations?

Have you tried to break it down to one step at a time (no contained model then add one at a time) and have a look at the produced SQL?

I usually blindly add a 'recursive' = -1 clause in all find options when I use containable to keep things simple (unless it is needed otherwise of course).

If you can't get it to work with contain you can always use plain old SQL to get the proper results, no need to accept whatever cake is pulling out for you with its magic.



On Wednesday, May 29, 2013 5:43:21 PM UTC+3, Robert Gravel wrote:
Hi John, This was the exact code i tried in my second example. putting the condition for the current model seems to break the containable method and then all related models are returned. also the date search within the Attendance model also breaks.

There must be a way here I am not seeing.

I would hate to return all users and have to loop thru potentially thousands to rebuild the array.

Any other options?

Robert


On Wed, May 29, 2013 at 6:25 AM, John <spi...@gmail.com> wrote:
The message is telling you what is wrong, you are asking containable to contain the starting Model again

$users = $this->User->find('all',
  array(
    'conditions' => $cond2
  ),
  array(
    'contain' => array(
      'Attendance' => array(
        'conditions' => $cond
      ),
      'Usermembership'
    )
  )
);


I think there's the problem, make your code like this:

$users = $this->User->find('all',
  array(
    'conditions' => $cond2,

    'contain' => array(
      'Attendance' => array(
        'conditions' => $cond
      ),
      'Usermembership'
    )
  )
);


I always indent arrays inside finds to the extremes, especially if something is wrong because it helps to understand hierarchy and nesting better. You can always compact it to a single line if you think it's better later


On Wednesday, May 29, 2013 6:10:47 AM UTC+3, Robert Gravel wrote:
Hi experts,

I am having an issue with containable. I have no problems returning the proper records for Attendance condition but the database call will still return all users in database with empty attendance field.
I need to return only User.school_id that match admin's $session_school_id

tried this
$this->User->Behaviors->attach('Containable');
$from =  $this->data['User']['start_date']['year'] . "-" . $this->data['User']['start_date']['month'] . "-" . $this->data['User']['start_date']['day'];
 $to =  $this->data['User']['end_date']['year'] . "-" . $this->data['User']['end_date']['month'] . "-" . $this->data['User']['end_date']['day'];
$cond = array('Attendance.created BETWEEN ? AND ?' => array($from, $to), 'Attendance.school_id' => $session_school_id);
// return only school user
$cond2 = array('User.school_id' => $session_school_id);
$users = $this->User->find('all', array('contain' => array('Attendance' => array('conditions' => $cond), 'Usermembership', 'User' => array('conditions' => $cond2) )));

this gives me Warning (512): Model "User" is not associated with model "User"

and tried this

$users = $this->User->find('all', array('conditions' => $cond2), array('contain' => array('Attendance' => array('conditions' => $cond), 'Usermembership' )));

does not work either.

cake 1.3
Thank you
Robert

--
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+u...@googlegroups.com.
To post to this group, send email to cake...@googlegroups.com.

--
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+u...@googlegroups.com.
To post to this group, send email to cake...@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.
 
 

--
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+unsubscribe@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.
 
 


--
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+unsubscribe@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.
 
 

No comments: