0

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

我有两个表languagerich_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();

有人看到我没看到的吗?

4

1 回答 1

3

如 API 中所述:

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

取自Query::join() | 使用条件和类型

尝试以下操作:

$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();
于 2015-12-17T09:13:27.940 回答