Я использую TranslationBehavior для обработки переведенных данных в моем приложении. При извлечении данных CakePHP возвращает переведенную строку или, если эта строка недоступна, значение локали по умолчанию. Для запроса данных используется следующий запрос:
$items = $this->Model->find('all')
->all()
->extract('name');
Чтобы заказать вывод, запрос:
$items = $this->Model->find('all')
->order([$this->Model->translationField('name') => 'ASC'])
->all()
->extract('name');
Это работает для всех элементов локали по умолчанию и всех переведенных элементов. Но когда перевод для записи отсутствует, это нарушит порядок. В этом случае возвращается правильное запасное значение, но порядок больше не является правильным. Вывод выглядит так:
['A... (Translated)', 'B... (Translated)', 'A... (Default)', 'C... (Default)']
Что я ожидаю, так это следующий порядок:
['A... (Default)', 'A... (Translated)', 'B... (Translated)', 'C... (Default)']
Для этого я изменил запрос на:
$items = $this->Model->find('all')
->order(['IF('.$this->Model->translationField('name').' != "", '.$this->Model->translationField('name').', Model.name)' => 'ASC'])
->all()
->extract('name');
Что дает ожидаемый порядок:
['A... (Default)', 'A... (Translated)', 'B... (Translated)', 'C... (Default)']
Вопрос: это правильный способ обработки порядка смешанных локалей? Или я что-то упустил и CakePHP уже предлагает более простое решение?
Вы можете спросить, почему мы должны смешивать локали? В моем случае нет необходимости переводить все строки, потому что некоторые элементы идентичны на обоих языках.