使用翻译行为时如何查询翻译内容?

How to query translated content when using the translate behavior?

我的网站使用多种语言,因此文章标题取决于当地语言。但是有一个问题:如何搜索其他语言的文章?

目前,唯一的方法是输入英文标题,例如,cakePHP 会检索法文名称。我无法用法语搜索它。

例如: 当我搜索 "Hello" 时,我找到了名为 "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 格式,这将导致具有绑定值的正确查询!

请务必阅读Cookbook > Database Access & ORM > Query Builder > Advanced Conditions了解更多关于如何正确构建高级条件的信息!

正在搜索翻译的内容

按翻译内容搜索,好吧,翻译行为为每个 translatable 字段添加了一个 hasOne 关联,默认情况下命名方案是 TableAlias_field_translation,例如 Ingredients_name_translation.

自动包含关联,因此您可以在其 content 字段上搜索,该字段可能包含翻译后的内容。

从 CakePHP 3.4.0 和 3.4.4 开始,您可以使用翻译行为提供的 translationField() 方法,它将 return 根据区域设置正确别名的字段:

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

注意在3.4.4之前,translationField()不会考虑locale设置与默认locale匹配的情况!在那种情况下,您可能希望针对原始 tables name 列进行查询,但在 3.4.4 之前,该方法将始终 return 相关翻译的 content 列 table.

另见 Cookbook > Database Access & ORM > Behaviors > Translate > Querying Translated Fields

在 CakePHP 3.4 之前的版本中,您必须自己构建列名,例如:

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

在上述情况下,定位集与默认语言相匹配,翻译行为将不包含翻译 table 关联,因此您必须采取适当的措施以确保正确根据使用的语言,在条件中使用字段,即使用 Ingredients.name 以防使用默认语言!