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 注释:

我认为 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();
}