tags:

views:

324

answers:

1

I am having a very curious problem. I am trying to do a find with conditions that work across model relationships. To wit...

$this->Model->find('first', array(
    'conditions' => array(
        'Model.col1' => 'value',
        'RelatedModel.col2' => 'value2')));

...assuming that Model has a hasMany relationship to RelatedModel. This particular find bombs out with the following error message:

Warning (512): SQL Error: 1054: Unknown column 'RelatedModel.col2' in 'where clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 525]

Looking at the SELECT being made, I quickly noticed that the comparison in the related model was in fact being placed in the WHERE clause, but for some reason, the only thing in the FROM clause was Model, with no sign of RelatedModel. If I remove the comparison that uses the relationship, related models ARE pulled in the result.

I'm using Cake 1.2.4. At first glance, there's nothing in the 1.2.4 -> 1.2.5 changelog that I see that covers this, and you would think that such an obvious bug would be hunted down and fixed a few days later, as opposed to waiting a full month and not mentioning anything in the release annoucement.

So, uh, what's going on?

+2  A: 

If your models are using the Containable behavior, make sure you contain those models.

First, in your {model_name}.php file:

class {ModelName} extends AppModel {
    var $actsAs = array('Containable');
}

Then in your find:

$results = $this->Model->find('first', array(
    'conditions' => array(
        'Model.col1' => 'value',
        'RelatedModel.col2' => 'value2',
    ),
    'contain' => array('RelatedModel'),
));

If not using Containable behavior, then try explicitly increasing the recursion level:

$results = $this->Model->find('first', array(
    'conditions' => array(
        'Model.col1' => 'value',
        'RelatedModel.col2' => 'value2',
    ),
    'recursive' => 1,
));

Note that the latter method will more than likely retrieve a lot of unnecessary data, slowing down your application's speed. As such, I highly recommend implementing the use of the Containable behavior.

Matt Huggins