Cakephp3 не распознает таблицу с другим именем в глубоких ассоциациях - PullRequest
0 голосов
/ 31 декабря 2018

Я создал таблицу с именем 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 голосов
/ 10 января 2019

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

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