0

我创建了一个名为 的表Delegates,并创建了一个用户表和用户实体。而且我已经习惯$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 查询生成器有问题。

4

1 回答 1

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();
}
于 2019-01-10T09:14:16.167 回答