其他分享
首页 > 其他分享> > 使用翻译行为时如何查询翻译内容?

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

作者:互联网

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

现在,唯一的方法是用英语键入标题,以便例如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 =>.值格式,这将导致带有绑定值的正确查询!

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

搜索翻译内容

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

关联是自动包含的,因此您可以在其内容字段中进行搜索,该字段可能包含翻译后的内容.

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

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

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

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

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

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

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

标签:php,cakephp,cakephp-3-0,internationalization
来源: https://codeday.me/bug/20191011/1891456.html