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



烹饪书描述了如何检索实体的所有翻译,但它使用的是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();

但它会导致EagerLoader::normalized中的"错误:无法将Closure类型的对象用作数组"。

我是错过了一些明显的东西(或者不那么明显?(,还是这不是一个受支持的选项?

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

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

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

另请参见

  • Cookbook>数据库访问&结果>检索数据&结果集>通过主键获取单个实体

最新更新