CakePhp Containable Error: двухуровневая ассоциация не работает
-
12-12-2019 - |
Вопрос
Я делаю следующий запрос:
$this->find('all',array(
'contain' => array(
'User' => array('id','facebook_id','name','username','Author' => array('first_name','last_name','code','photo')),
'Tab.code'
),
'fields' => array('Comment.date','Comment.time','Comment.content'),
'conditions' => array(
'Tab.code' => $code
),
'limit' => $limit,
'offset' => $offset
));
.
Комментарий ...
public $belongsTo = array(
'User' => array('foreignKey' => 'user_id'),
'Tab' => array('foreignKey' => 'tab_id')
);
.
Пользователь ...
public $hasOne = array('Author' => array('foreignKey' => 'id'));
.
и автор ...
public $belongsTo = array(
'User' => array(
'className' => 'User',
'foreignKey' => 'id'
)
);
.
Это возвращает что-то вроде этого (в JSON) ...
[
{
"Comment": {
"date": "2001-12-15",
"time": "17:32:12",
"content": "..."
},
"User": {
"id": "29",
"facebook_id": "1234",
"name": "User 29",
"username": "user29"
},
"Tab": {
"code": "llibre-de-prova-29",
"id": "229"
}
}
...
]
.
... Пока я ожидаю, что прикреплено к пользователю, появляется автор с указанными мной полями.Знаете ли вы, почему автор не появляется?Я сделал другой, содержит два уровня рекурсивности в коде и все работает, как и ожидалось.
Спасибо за вашу помощь и внимание!
Решение
Убедитесь, что ваша модель имеет контекстное поведение.Он должен включать следующую строку:
$actsAs = array('Containable');
.
Обратите внимание, чтобы убедиться, что вы не пропустили «S» в «acts», что является общим опечаткам, которое трудно обнаружить.Вы также можете прикрепить кондиционеруемое поведение на лету, как это:
$this->YourModel->Behaviors->attach('Containable');
$this->YourModel->find('all', array('contain' => array(...)));
.
Также убедитесь, что вы введите «содержащие» в качестве клавиши массива, а не «содержит».
Другие советы
Вам необходимо указать поля в клавише «Поля».Обратите внимание на это как дополнительный вызов find()
.
$this->find('all', array(
'contain' => array(
'User' => array(
'fields' => array('id','facebook_id','name','username'),
'Author' => array(
'fields' => array('first_name','last_name','code','photo')
),
'Tab.code'
),
),
'fields' => array('Comment.date','Comment.time','Comment.content'),
'conditions' => array(
'Tab.code' => $code
),
'limit' => $limit,
'offset' => $offset
));
. $this->find('all',array(
'contain' => array(
'User' => array('id','facebook_id','name','username','Author' =>array( 'AuthorModelName'=>array('first_name','last_name','code','photo'))),
'Tab.code'
),
. Все иностранные ключи должны быть в вашем полях массива
'fields' => array('Comment.date','Comment.time','Comment.content', 'Comment.user_id', ....)
.