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();
另见
食谱描述了如何 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();
另见