Множественные ассоциации ownTo () в CakePHP 3.x

Я использую CakePHP 3.x.
Мой вопрос: возможно ли иметь много ассоциаций ownTo () с одним и тем же внешним ключом?

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

В таблице моделей я использовал ассоциацию ownTo () следующим образом:

$this->belongsTo('Pilotes', [
    'className' => 'Users',
    'foreignKey' => 'pilote',
    'propertyName' => 'pilote_user'
]);

$this->belongsTo('Verificateurs', [
    'className' => 'Users',
    'foreignKey' => 'no_user',
    'propertyName' => 'verificateur_user'
]);

$this->belongsTo('Users', [
    'className' => 'Users',
    'foreignKey' => 'no_user',
    'propertyName' => 'user'
]);

Но когда я отлаживаю свою сущность, два первых поля содержат только внешний ключ, а последнее нормально.

Запрос:

public function view($id = null)
{
    $demande = $this->Demandes->get($id, [
        'contain' => ['Users']
    ]);
    $this->set('demande', $demande);
    $this->set('_serialize', ['demande']);
}

Вот результат работы debug ():

object(App\Model\Entity\Demande) {
'new' => false,
'accessible' => [
    'pilote' => true,
    'verificateur' => true,
    'pilote_user' => true,
    'verificateur_user' => true,
    'user' => true,
],
'properties' => [
    'no_demande' => (int) 4,
    'pilote' => (int) 3,
    'verificateur' => (int) 2,
    'no_user' => (int) 1,
    'user' => object(App\Model\Entity\User) {
        /* Details of the user */
    },
],
'dirty' => [],
'original' => [],
'virtual' => [],
'errors' => [],
'repository' => 'Demandes'
}

Если я прокомментирую свой последний метод ownTo (), второе поле будет в порядке, но не первое.

заранее спасибо


person Jun    schedule 05.05.2015    source источник
comment
Какой запрос дает этот результат?   -  person José Lorenzo Rodríguez    schedule 06.05.2015
comment
Я добавил запрос в свой пост   -  person Jun    schedule 07.05.2015
comment
Вы должны содержать другие ассоциации 'contain' => ['Users', 'Verificateurs', 'Pilotes']   -  person José Lorenzo Rodríguez    schedule 07.05.2015


Ответы (1)


Измените имя в первом аргументе:

$this->belongsTo('Pilotes', [
    'className' => 'Users',
    'foreignKey' => 'pilote',
    'propertyName' => 'pilote_user'
]);

$this->belongsTo('Verificateurs', [
    'className' => 'Users',
    'foreignKey' => 'verificateur',
    'propertyName' => 'verificateur_user'
]);

$this->belongsTo('Users', [
    'className' => 'Users',
    'foreignKey' => 'no_user',
    'propertyName' => 'user'
]);

Обратите внимание, что, поскольку вы решили использовать pilote и verificateur в качестве имен столбцов в вашей схеме, вам необходимо изменить значение propertyName. Это потому, что Cake создаст свойство в ваших сущностях с этим именем, и оно будет конфликтовать со свойствами в вашей таблице.

Вот почему мне, например, пришлось выбрать pilote_user в качестве имени свойства для вашей сущности.

При запросе данных вам нужно будет добавить 'contain' => ['Users', 'Verificateurs', 'Pilotes'] в параметры поиска.

person José Lorenzo Rodríguez    schedule 05.05.2015
comment
Я все еще получаю только внешний ключ с вашим кодом. Внешний ключ - это одно и то же поле для трех моих ассоциаций, меняется только значение. - person Jun; 05.05.2015
comment
Это не может быть один и тот же внешний ключ для всех трех ассоциаций ownTo по причинам, которые, я надеюсь, очевидны :) - person José Lorenzo Rodríguez; 05.05.2015
comment
Может быть, я что-то неправильно понял в Поваренной книге, но почему у меня не может быть один и тот же внешний ключ для разных атрибутов? ownTo () представляет ассоциацию 1-n, не так ли? - person Jun; 05.05.2015
comment
Разве это не было бы hasMany? Одна запись в таблице имеет n в другой, то есть hasMany для меня. Ассоциация принадлежит к ассоциации n - 1 - person José Lorenzo Rodríguez; 05.05.2015
comment
Я разместил снимок экрана своих таблиц здесь. no_user - это внешний ключ для pilote, verificateur и no_user, поэтому он должен быть ownTo (), верно? С другой стороны, у меня в таблице Users hasMany(). Я совершенно не прав? - person Jun; 05.05.2015
comment
Да, у вас может быть только одна ассоциация на foreignKey. Одним большим исключением было бы добавление дополнительных условий в ассоциацию для идентификации пользователя с тем же foreignKey + отличительным условием. - person José Lorenzo Rodríguez; 05.05.2015
comment
Каковы причины этого ограничения? Я имею в виду, почему мы можем установить один и тот же внешний ключ для нескольких полей в MySQL и не использовать его с CakePHP? - person Jun; 05.05.2015
comment
Позвольте мне сначала кое-что понять, поскольку все эти ассоциации будут иметь один и тот же внешний ключ, вы действительно ожидаете, что для каждой ассоциации будут разные значения? - person José Lorenzo Rodríguez; 05.05.2015
comment
О, еще раз посмотрев на вашу схему, я вижу, что у вас действительно разные внешние ключи !!! внешние ключи - это pilote, verificateur и no_user .. Таким образом, у вас фактически есть разные внешние ключи для каждой ассоциации, которую вы хотите создать - person José Lorenzo Rodríguez; 05.05.2015
comment
Да, я думаю, что я был недостаточно ясен. no_user в Users - это ссылочный ключ, а в Demandes, pilote, verificateur и no_user могут иметь разные значения - person Jun; 05.05.2015
comment
Спасибо за обновленный ответ. У меня та же проблема, за исключением того факта, что теперь у меня появляется ошибка: Demandes не связан с пользователями, если я прокомментирую свою последнюю ассоциацию. Я думаю, это вызвано отсутствием сущностей Pilotes и Verificateurs. Поэтому я попытался сохранить Users в качестве первого аргумента и получил результат в новом свойстве, но все равно только один. - person Jun; 05.05.2015
comment
Обновите свой вопрос, добавив ассоциации в том виде, в котором они у вас есть сейчас - person José Lorenzo Rodríguez; 06.05.2015