Cakephp3在深度关联中无法识别具有不同名称的表

时间:2018-12-31 02:09:26

标签: cakephp cakephp-3.7

我创建了一个名为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 个答案:

答案 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();
}