CakePHP 3.4.7 - 如何查询包含的关联中的翻译内容?

时间:2017-12-29 10:00:32

标签: cakephp translate

我将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'

1 个答案:

答案 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(); 方法来确保在当前设置的区域设置上使用正确的字段。

另见