我正在尝试学习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();
有人看到我看不到的东西吗?
答案 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();