我将cakephp升级到cakephp 3.4.7版本。我的网站有多种语言,因此评论和作者的标题取决于当地。 如何查询包含的关联中的翻译内容? 控制器中的php代码如下所示:
//Comments belongsTo Authors
$this->loadModel('Comments');
$comments = $this->Comments->find('all')->where(['Comments.active' => 1])->contain([
'Authors' => function ($q) {
return $q
->where(['Authors.title LIKE' => '%'.$this->term.'%','Authors.active' => 1])
->order(['Authors.position' => 'ASC']);
}
])->toArray();
这仅适用于默认语言,但是当我更改语言时,我总是得到一个空数组。表i18n包含其他语言的“评论”和“作者”的记录。在'作者'模型中:
$this->addBehavior('Translate', ['fields' => ['title','text']]);
当我根据示例更改代码时:How to query translated content when using the translate behavior?我得到了以下结果:
//Authors hasMany Comments - IT WORKS!!!
$this->loadModel('Authors');
$authors = $this->Authors->find('all')->where(['Authors.active' => 1])->contain([
'Comments' => function ($q) {
return $q
->where(['Comments_title_translation.content LIKE' => '%'.$this->term.'%','Comments.active' => 1])
->order(['Comments.position' => 'ASC']);
}
])->toArray();
//Comments belongsTo Authors - IT DOES NOT WORK!!!
$this->loadModel('Comments');
$comments = $this->Comments->find('all')->where(['Comments.active' => 1])->contain([
'Authors' => function ($q) {
return $q
->where(['Authors_title_translation.content LIKE' => '%'.$this->term.'%','Authors.active' => 1])
->order(['Authors.position' => 'ASC']);
}
])->toArray();
事实上,我的问题是第二个例子 //评论所属作者 显示以下错误: 错误:SQLSTATE [42S22]:找不到列:1054'on clause'中的未知列'Authors_title_translation.content'
答案 0 :(得分:1)
问题是生成连接的顺序,它适用于hasMany
关联,因为该关联是在单独的查询中检索的,LIKE
条件直接应用于{该查询的{1}}子句。
如果存在WHERE
关联,则关联表将加入主查询,并且belongsTo
配置中传递的条件将应用于联接contain
子句中,在之前发生正在定义转换表的连接,因此错误。
您可以在主查询中应用条件:
ON
或更改为$this->Comments
->find('all')
->where([
$this->Comments->Authors->translationField('title') . ' LIKE' =>
'%' . $this->term . '%',
'Authors.active' => 1,
'Comments.active' => 1
])
->contain([
'Authors' => function ($q) {
return $q->order(['Authors.position' => 'ASC']);
}
])
->toArray();
或select
策略以获取关联数据。在这两种情况下,相关数据都将在单独的查询中检索,条件将应用于其subquery
子句:
WHERE
正如评论中所提到的,在任何情况下都应该使用翻译行为$this->Comments
->find('all')
->where(['Comments.active' => 1])
->contain([
'Authors' => [
'strategy' => \Cake\ORM\Association::STRATEGY_SELECT,
'queryBuilder' => function ($q) {
return $q
->where([
$this->Comments->Authors->translationField('title') . ' LIKE' =>
'%' . $this->term . '%',
'Authors.active' => 1
])
->order(['Authors.position' => 'ASC']);
}
]
])
->toArray();
方法来确保在当前设置的区域设置上使用正确的字段。
另见