CakePHP 3中的InnerJoin不返回任何行

时间:2015-12-17 04:27:19

标签: php mysql cakephp cakephp-3.x

我正在尝试学习CakePHP 3,但我遇到了一个问题:

我有两个表 languages rich_text_elements ,并希望以下列方式加入它们:

$all = $this->find()->
select(['i18n','Language.long_name'])->
innerJoin(['Language' => 'languages'], ['Language.i18n' => 'RichTextElements.i18n'])->
group('RichTextElements.i18n')->
order(['RichTextElements.i18n'])->all();

生成以下查询:

SELECT RichTextElements.i18n AS `RichTextElements__i18n`, 
Language.long_name AS `Language__long_name` 
FROM rich_text_elements RichTextElements 
INNER JOIN languages Language ON Language.i18n = :c0 
GROUP BY RichTextElements.i18n  ORDER BY RichTextElements.i18n;

如果我将“:c0”替换为“RichTextElements.i18n”,则此查询单独运行(在HeidiSql中)并返回五行数据,正如我预期的那样。

但CakePHP返回一个空集!

问题似乎与innerJoin()有关,因为如果我将查询修改为仅从 RichTextElements 表中选择,它将在CakePHP中按预期返回五行:

运行良好:

$all = $this->find()->
select(['i18n'])->
group('RichTextElements.i18n')->
order(['RichTextElements.i18n'])->all();

有人看到我看不到的东西吗?

1 个答案:

答案 0 :(得分:3)

如API中所述:

  

条件可以表示[...]使用字符串比较列,或字符串与已引用的文字值。另外,可以使用以数组或表达式对象表示的条件。

取自Query::join() | Using conditions and types

尝试以下方法:

$all = $this->find()
    ->select(['i18n','Language.long_name'])
    ->innerJoin(
        ['Language' => 'languages'],
        ['Language.i18n' => new \Cake\Database\Expression\IdentifierExpression('RichTextElements.i18n')])
    ->group('RichTextElements.i18n')
    ->order(['RichTextElements.i18n'])->all();

这也应该有效:

$all = $this->find()
    ->select(['i18n','Language.long_name'])
    ->innerJoin(
        ['Language' => 'languages'],
        ['Language.i18n = RichTextElements.i18n'])
    ->group('RichTextElements.i18n')
    ->order(['RichTextElements.i18n'])->all();