Как запросить переведенный контент при использовании поведения перевода?

Мой сайт находится на нескольких языках, поэтому название статьи зависит от локального. Но есть проблема: как я могу искать статью на другом языке?

Прямо сейчас, единственный способ – напечатать заголовок на английском языке, чтобы cakePHP извлекал имя на французском языке, например. Я не могу найти его на французском.

Например: Когда я ищу «Привет», я нахожу статью под названием «Bonjour». Но когда я ищу «Bonjour», я не могу найти какую-либо статью.

Итак, как мне искать на другом языке? Кажется, что Cakephp сначала ищет язык по умолчанию, чтобы затем получить трайкеры.

В моем контроллере:

$this->Ingredients->locale('fr_CA'); $data = $this->Ingredients->find('all') ->select([ 'Ingredients.id', 'Ingredients.name' ]) ->where(["Ingredients.name LIKE '%".$this->request->query['k']."%'"]) ->order('Ingredients.recipe_count'); 

SQL-инъекции!

Во-первых, у вас есть уязвимость SQL-инъекции, поскольку вы вставляете пользовательские данные в фрагмент SQL вместо использования формата key => value , что приведет к соответствующим запросам со связанными значениями!

Обязательно прочитайте « Поваренную книгу»> «Доступ к базам данных» и «ORM»> «Конструктор запросов»> «Расширенные условия» для получения дополнительной информации о том, как правильно создавать дополнительные условия!

Поиск переведенного контента

Поиск по переведенному контенту, а также поведение Translate добавляет ассоциацию hasOne для каждого переводимого поля, а по умолчанию схема именования – TableAlias_field_translation , поэтому, например, Ingredients_name_translation .

Связь выполняется автоматически, поэтому вы можете искать в своем поле content , которое, возможно, будет содержать переведенный контент.

Начиная с CakePHP 3.4.0, соответственно 3.4.4, вы можете использовать метод translationField() предоставляемый поведением перевода, он вернет правильное поле с псевдонимом в зависимости от локали:

 ->where([ $this->Ingredients->translationField('name') . ' LIKE' => '%' . $this->request->query('k') . '%' ]) 

Обратите внимание, что до 3.4.4 translationField() не учитывала бы случай, когда набор локалей соответствует языку по умолчанию! В этой ситуации вы хотите запросить исходный столбец name таблиц, но до 3.4.4 метод всегда будет возвращать столбец content связанной таблицы переводов.

См. Также « Поваренная книга»> «Доступ к базе данных» и «ORM»> «Поведение»> «Перевод»> «Запрос обработанных полей»

В версиях до CakePHP 3.4 вам нужно будет создать имя столбца самостоятельно, например:

 ->where([ 'Ingredients_name_translation.content LIKE' => '%' . $this->request->query['k'] . '%' ]) 

В указанном выше случае, когда набор мест совпадает с языком по умолчанию, поведение в переводе не будет содержать ассоциаций таблиц трансляции, поэтому вам необходимо принять соответствующие меры для обеспечения правильного использования поля в условиях на основе на используемом языке, т.е. используйте Ingredients.name в случае использования языка по умолчанию!