我创建了一个名为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查询生成器存在问题。
答案 0 :(得分: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();
}