Поведение перевода Cake PHP 3.x: прочитать все переводы с помощью "get" - PullRequest
0 голосов
/ 29 марта 2020

Поваренная книга описывает, как получить все переводы для сущности , но она использует find('translations'). Также обсуждается, как получить все переводы для ассоциаций . Я надеюсь смешать их, используя get и функциональность сдерживания, потому что я уже читаю связанные записи одновременно.

Чтобы загрузить лигу и все связанные подразделения с их переводами, это работает :

$league = $this->Leagues->get($id, ['contain' => [
    'Divisions' => [
        'queryBuilder' => function (Query $q) {
            return $q->find('translations');
        },
    ],
]]);

Пока все хорошо. Но мне нужно загрузить все переводы для лиги. Это работает:

$league = $this->Leagues->find('translations')->where(['Leagues.id' => $id])->contain([
    'Divisions' => [
        'queryBuilder' => function (Query $q) {
            return $q->find('translations');
        },
    ],
])->first();

, но это несовместимо со всем другим моим кодом для чтения одной сущности, которая всегда использует get. Я попытался это:

$league = $this->Leagues->get($id, ['contain' => [
    'queryBuilder' => function (Query $q) {
        return $q->find('translations');
    },
    'Divisions' => [
        'queryBuilder' => function (Query $q) {
            return $q->find('translations');
        },
    ],
]])->first();

, но это приводит к «Ошибка: невозможно использовать объект типа Closure как массив» из EagerLoader::normalized.

Я что-то упускаю из виду (или не так очевидно) ?), или это не поддерживаемая опция?

1 Ответ

1 голос
/ 29 марта 2020

queryBuilder - это опция для фактической локализации, вы не можете использовать ее в качестве ключа верхнего уровня.

Вам нужна опция finder метода get():

$league = $this->Leagues
    ->get($id, [
        'finder' => 'translations',
        'contain' => [
            'Divisions' => [
                'queryBuilder' => function (Query $q) {
                    return $q->find('translations');
                },
            ],
        ]
    ])
    ->first();

См. Также

...