InnerJoin в CakePHP 3 не возвращает строк

Я пытаюсь изучить 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();

Кто-нибудь видит то, чего я не вижу?

0

Решение

Как указано в 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();
3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector