Martin Bean
Martin Bean

Reputation: 39389

Why aren't my models linking?

I'm trying to link two (and more) models in a CakePHP application.

I have two database tables: clients and notes. I have the following model classes:

<?php
class Client extends AppModel {
    var $name = 'Client';
    var $hasMany = 'Note';
}

And:

<?php
class Note extends AppModel {
    var $name = 'Note';
    var $belongsTo = 'Client';
}

However, I don't think they're linking. When I run print_r($this->Client->find()); in a controller I get the following output:

Array
(
    [Client] => Array
        (
            [id] => 1
            [name] => Martin Bean
        )

)

How can I also fetch the associated Note records for each Client?

EDIT: Despite having the above in my model classes, if I place the following in a controller:

$this->Client->Behaviors->attach('Containable');
print_r($this->Client->find('all', array('contain' => 'Note')));

I get the following error message:

Warning (512): Model "Client" is not associated with model "Note" [CORE/cake/libs/model/behaviors/containable.php, line 363]

Have I missed something that isn't explained in the CakePHP cookbook?

EDIT 2: I don't know if this is any help; it's the debug output:

ContainableBehavior::containments() - CORE/cake/libs/model/behaviors/containable.php, line 363 ContainableBehavior::beforeFind() - CORE/cake/libs/model/behaviors/containable.php, line 121 ModelBehavior::dispatchMethod() - CORE/cake/libs/model/model_behavior.php, line 169 BehaviorCollection::trigger() - CORE/cake/libs/model/model_behavior.php, line 494 Model::find() - CORE/cake/libs/model/model.php, line 2108 PostsController::index() - APP/controllers/posts_controller.php, line 6 Dispatcher::_invoke() - CORE/cake/dispatcher.php, line 204 Dispatcher::dispatch() - CORE/cake/dispatcher.php, line 171 [main] - APP/webroot/index.php, line 83

Upvotes: 1

Views: 225

Answers (3)

Martin Bean
Martin Bean

Reputation: 39389

Fixed it! My models' filenames were incorrect.

Instead of client.php or note.php I had saved them as client_model.php and note_model.php. All works fine now!

Upvotes: 0

Leo
Leo

Reputation: 1529

So just to confirm

You have two tables 'notes' and 'clients'

Both have a primary key named id

'notes' contains 'client_id'

There is correct test data, 'client' with id 1 is on several 'note' rows

Before your find() call there is not a $this->Client->recursive = -1 assignment.

Add

$var actsAs = array('Containable');

to both your Client and Note model or just add it to your app_model.php to attach the containable behaviour to every model automatically.

P.S Set debug to 2 to clear our the model cache if you have recently added a new table or amended a field.

Upvotes: 1

dogmatic69
dogmatic69

Reputation: 7575

look up containable. $this->Client->find('all', array('contain' => array('Note')));

Upvotes: 0

Related Questions