Контейнерное поведение CakePHP не работает должным образом

У меня есть следующие таблицы базы данных:

products
********
id
title
artist_id

artists
*******
id
profile
rating
person_id

people
******
id
full_name

Со следующими модельными ассоциациями:

Product Model
*************
public $belongsTo = array(
    'Artist' => array(
        'className'  => 'Artist'
        'foreignKey' => 'artist_id'
    )
);

Artist Model
************
public $belongsTo = array(
    'Person' => array(
        'className'  => 'Person'
        'foreignKey' => 'person_id'
    )
);
public $hasMany = array(
    'Product' => array(
        'className'  => 'Product'
        'foreignKey' => 'product_id'
    )
);

Person Model
************
public $hasOne = array(
    'Artist' => array(
        'className'  => 'Artist'
        'foreignKey' => 'person_id'
    )
);

Я настроил каждую из трех моделей на использование поведения Containable, используя:

public $actsAs = array('Containable');

Когда я использую следующее, чтобы получить информацию о продукте вместе с именем исполнителя:

$this->Product->find('first', array('conditions' => array('Product.id' => $id), 'contain' => 'Person.full_name'))

Я получаю предупреждение:

Model "Product" is not associated with model "Person"

И я получаю только информацию о продукте, т.е. без имени исполнителя. Почему это происходит?


person freshest    schedule 08.11.2011    source источник


Ответы (1)


Это происходит потому, что вы вызываете операцию find для модели Product, а Person не напрямую связана с Product, а косвенно, через отношение к Artist. В этом случае ваш массив contain должен выглядеть примерно так:

$this->Product->find('first', array(
    'conditions' => array('Product.id' => $id), 
    'contain' => array('Artist' => 'Person.full_name')
));

Это вернет результат, например

array(
    [Product] => array(...),
    [Artist] => array(
        [Person] => array(
             'full_name' => '...'
        )
    )
)
person Doug Owings    schedule 09.11.2011