Я пытаюсь изучить CakePHP 3, но столкнулся с проблемой:
У меня две таблицы языки а также 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 table, он вернет пять строк, как и ожидалось, в CakePHP:
Работает нормально:
$all = $this->find()->
select(['i18n'])->
group('RichTextElements.i18n')->
order(['RichTextElements.i18n'])->all();
Кто-нибудь видит то, чего я не вижу?
Как указано в 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();
Других решений пока нет …