Cakephp3 не распознает таблицу с другим именем в глубоких ассоциациях
Я создал таблицу под названием Delegates
и я создал UsersTable и User Entity. И я использовал $this->setTable('delegates');
в UsersTable
чтобы иметь доступ к делегатам из $this->Users;
(Я просто хочу сказать, что создал пользовательскую модель с таблицей делегатов)
Все идет нормально...
В моем приложении я пытаюсь получить доступ к глубоким ассоциациям. Все хорошо с этим запросом, но когда я contain
User
модель, которую я получаю The Users association is not defined on Comments.
Я могу подтвердить, что ассоциации установлены правильно.
...
// There are more associations up there.
...
'Comments', [
'className' => 'App\Model\Table\CommentsTable',
'foreignKey' => 'delegate_assessment_criteria_id',
'belongsTo' => [
'Assessors' => [
'className' => 'App\Model\Table\AssessorsTable',
'foreignKey' => 'assessor_id',
],
'Users' => [
'className' => 'App\Model\Table\UsersTable',
'foreignKey' => 'delegate_id',
]
]
]
Здесь глубокая ассоциация.
...
// There are more associations up there.
...
'Comments' => function($q) {
return $q
->select([
'id'
])
->order(['Comments.created DESC'])
->contain([
'Assessors' => function($q) {
return $q
->select([
'id'
])
->enableAutoFields();
}
])
->contain([
'Users' => function($q) {
return $q
->select([
'id',
'delegate_id'
])
->enableAutoFields();
}
])
->enableAutoFields();
}
2 примечания:
- Если я буду содержать
User
модель в самой первой в иерархии моего запроса я могу получить доступ кUser
поля, но в глубокой ассоциации это не работает. - Если я содержу
Delegates
оно работает.
Я полагаю, что есть проблема с конструктором запросов Cakephp.
1 ответ
Хорошо, наконец, я понял это. Я сделал это, прежде чем я не знаю, почему я забыл. Вероятно, потому что я был в глубокой ассоциации, я впитал это.
Глубокая ассоциация содержала конфликт с самым первым содержанием. если бы я поставил разные propertyName
в глубоких ассоциациях тогда это делает цель.
Имейте в виду, что вы должны установить эти ассоциации на своих настольных моделях.
'Comments', [
'className' => 'App\Model\Table\CommentsTable',
'foreignKey' => 'delegate_assessment_criteria_id',
'belongsTo' => [
'Assessors' => [
'className' => 'App\Model\Table\AssessorsTable',
'foreignKey' => 'assessor_id',
],
'Delegates' => [ // <= Here set the name of Assossiation you want to be shown in array
'className' => 'App\Model\Table\UsersTable',
'propertyName' => 'delegates', // <= Add propertyName and set another name here
'foreignKey' => 'delegate_id',
]
]
]
И по ассоциации
'Comments' => function($q) {
return $q
->select([
'id'
])
->order(['Comments.created DESC'])
->contain([
'Assessors' => function($q) {
return $q
->select([
'id'
])
->enableAutoFields();
}
])
->contain([
'Users' => function($q) {
return $q
->select([
'id',
// 'delegate_id' // <= Remove this - We have already done it when we set the association on above code.
])
->enableAutoFields();
}
])
->enableAutoFields();
}