Cakephp3 无法识别深度关联中具有不同名称的 table
Cakephp3 doesn't recognize the table with different name in deep associations
我创建了一个名为 Delegates
的 table,并创建了一个 UsersTable 和用户实体。我在 UsersTable
中使用了 $this->setTable('delegates');
以便能够从 $this->Users;
访问委托(我只想说我已经创建了一个带有委托 table 的用户模型)
目前一切顺利...
在我的应用程序中,我试图访问深度关联。这个查询的一切都很好,但是当我 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 查询生成器有问题。
好吧,我终于明白了。之前做过,不知道为什么忘记了。可能是因为我有很深的联想,所以我倒进去了。
深层关联包含与第一个包含产生冲突。如果我在深层关联中设置不同的 propertyName
那么它就达到了目的。
请记住,您必须在 Table 模型上设置此关联。
'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();
}
我创建了一个名为 Delegates
的 table,并创建了一个 UsersTable 和用户实体。我在 UsersTable
中使用了 $this->setTable('delegates');
以便能够从 $this->Users;
访问委托(我只想说我已经创建了一个带有委托 table 的用户模型)
目前一切顺利...
在我的应用程序中,我试图访问深度关联。这个查询的一切都很好,但是当我 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 查询生成器有问题。
好吧,我终于明白了。之前做过,不知道为什么忘记了。可能是因为我有很深的联想,所以我倒进去了。
深层关联包含与第一个包含产生冲突。如果我在深层关联中设置不同的 propertyName
那么它就达到了目的。
请记住,您必须在 Table 模型上设置此关联。
'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();
}