Мой сайт находится на нескольких языках, поэтому название статьи зависит от локального. Но есть проблема: как я могу искать статью на другом языке?
Прямо сейчас, единственный способ – напечатать заголовок на английском языке, чтобы 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 вместо использования формата 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
в случае использования языка по умолчанию!