CakePHP 3.x 翻译行为:使用 "get" 阅读所有翻译

CakePHP 3.x translation behavior: read all translations with "get"

食谱描述了如何 retrieve all translations for an entity, but it's using find('translations'). It also discusses how to retrieve all translations for associations。我希望使用 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();

但它从 EagerLoader::normalized 得到 "Error: Cannot use object of type Closure as array"。

我是不是遗漏了一些明显的东西(或者不是很明显?),或者这不是一个受支持的选项?

queryBuilder 是一个实际包含的选项,您不能将它用作顶级密钥。

您要查找的是 get() 方法的 finder 选项:

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

另见