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

Mar*_*708 2 php cakephp internationalization cakephp-3.0

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

现在,唯一的方法是用英文键入标题,以便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');
Run Code Online (Sandbox Code Playgroud)

ndm*_*ndm 6

SQL注入!

首先,您所拥有的是SQL注入漏洞,因为您将用户数据插入到SQL片段而不是使用key => value格式,这将导致使用绑定值进行正确的查询!

有关如何正确构建高级条件的更多信息,请务必阅读Cookbook>数据库访问和ORM>查询生成器>高级条件!

搜索翻译的内容

通过翻译的内容进行搜索,转换行为hasOne为每个可翻译字段添加关联,并且默认情况下,命名方案是TableAlias_field_translation,例如Ingredients_name_translation.

该关联被自动包含,因此您可以搜索其content字段,该字段可能包含已翻译的内容.

从CakePHP 3.4.0开始,分别是3.4.4,你可以使用translationField()translate行为提供的方法,它将根据语言环境返回正确的别名字段:

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

请注意,在3.4.4之前,translationField()不会考虑语言环境集与默认语言环境匹配的情况!在这种情况下,您可能希望查询原始表name列,但在3.4.4之前,该方法将始终返回content关联转换表的列.

另请参阅食谱>数据库访问和ORM>行为>翻译>查询翻译字段

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

->where([
    'Ingredients_name_translation.content LIKE' => '%' . $this->request->query['k'] . '%'
])
Run Code Online (Sandbox Code Playgroud)

在上面提到的情况下,如果定位集与默认语言匹配,则翻译行为将不包含转换表关联,因此您必须采取适当的措施以确保在条件中使用正确的字段,关于使用的语言,即在使用Ingredients.name默认语言的情况下使用!