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

Cakephp3无法识别深度关联中具有不同名称的表,cakephp,cakephp-3.7,Cakephp,Cakephp 3.7,我创建了一个名为Delegates的表,并创建了一个UsersTable和User实体。我使用了$this->可设置的“委托”;在UsersTable中,可以从$this->Users访问代理;我只想说我已经创建了一个带有委托表的用户模型 到目前为止还不错 在我的应用程序中,我试图访问深层关联。这个查询一切正常,但是当我包含用户模型时,我得到的用户关联并没有在注释中定义 我可以确认关联设置正确 ... // There are more associations up there. ... '

我创建了一个名为Delegates的表,并创建了一个UsersTable和User实体。我使用了$this->可设置的“委托”;在UsersTable中,可以从$this->Users访问代理;我只想说我已经创建了一个带有委托表的用户模型

到目前为止还不错

在我的应用程序中,我试图访问深层关联。这个查询一切正常,但是当我包含用户模型时,我得到的用户关联并没有在注释中定义

我可以确认关联设置正确

...
// 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,那么它就达到了目的

请记住,必须在表格模型上设置此关联

结社

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

您的第一个代码块,您定义注释关联的地方,它在哪里?因为它看起来像是在另一个关联中定义用户关联,这根本不是它的工作方式。相反,用户与注释的关联必须发生在注释模型内部,这样,与注释关联的任何内容都可以达到下一个级别,而不必为与注释关联的每个模型重新定义它。希望这是清楚的。@GregSchmidt谢谢你,但这只是为了让读者了解我的表格模型的结构。正如我提到的,我有两个表,用户和代理。我想使用代理作为用户。所有关联都已在表模型中设置。请把问题再读一遍。我认为深度ORM关联存在问题。包括我在内的许多人每天都在使用深度关联。所以我相信你的代码有问题。如果您向我们展示更多的初始化函数,我们可能会给出更具体的建议。
'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();
}