标签:php cakephp cakephp-3-0 internationalization
我的网站是多种语言的,因此文章的标题取决于本地.但是有一个问题:如何搜索其他语言的文章?
现在,唯一的方法是用英语键入标题,以便例如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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。