Cakephp3 не распознает таблицу с другим именем в глубоких ассоциациях

Я создал таблицу под названием 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 ответ

Решение

Хорошо, наконец, я понял это. Я сделал это, прежде чем я не знаю, почему я забыл. Вероятно, потому что я был в глубокой ассоциации, я впитал это.

Глубокая ассоциация содержала конфликт с самым первым содержанием. если бы я поставил разные 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();
}
Другие вопросы по тегам