gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 19:49:46 24 4
gpt4 key购买 nike

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

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

例如:当我搜索“Hello”时,我找到了名为“Bonjour”的文章但是当我搜索“Bonjour”时,我找不到任何文章。

那么如何用另一种语言进行搜索呢?看来Cakephp是先用默认语言搜索,然后再获取翻译。

在我的 Controller 中:

$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 注入(inject)!

首先,您遇到的是 SQL 注入(inject)漏洞,因为您将用户数据插入到 SQL 片段中,而不是使用 key => value 格式,这会导致正确的查询具有绑定(bind)值!

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

搜索翻译内容

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

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

从 CakePHP 3.4.0 或 3.4.4 开始,您可以使用翻译行为提供的 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以防使用默认语言!

关于php - 使用翻译行为时如何查询翻译的内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31495745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com