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

时间:2015-07-18 21:27:12

标签: 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');

1 个答案:

答案 0 :(得分:6)

SQL注入!

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

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

搜索已翻译的内容

按翻译的内容进行搜索,翻译行为会为每个可翻译字段添加hasOne关联,默认情况下,命名方案为TableAlias_field_translation,例如Ingredients_name_translation

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

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

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

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

另请参阅 Cookbook > Database Access & ORM > Behaviors > Translate > Querying Translated Fields

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

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

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