在laravel中使用where like进行相对搜索



我正在php中执行数据搜索功能。我使用mongoDB。我有一张桌子user:

id        name         status
1         tèo           1
2         tý            2

UserRepository.php:中

<?php

namespace AppRepositoriesBackendMongoDB;
use AppModelsUser;
use AppRepositoriesMongoDBBaseRepository;
class UserRepository extends MongoDBBaseRepository
{
public function model()
{
return MoviePassContent::class;
}
public function search($keyword)
{
$search = $this->model->where('name', 'like', '%'.$keyword.'%')->get()->toArray();
// I tried more of these ways, but it still doesn't work
// $search = $this->model->where('name', 'like', $keyword.'%')->get()->toArray();
// $search = $this->model->where('name', 'like', '%'.$keyword)->get()->toArray();
}
}

如果我输入的$keyword是:tèo,则结果是正确的。但当我输入$keyword作为teot时,它返回null。我哪里出错了。请给我你的意见。非常感谢。

它与Laravel或PHP无关。这完全取决于您的数据库。请尝试在数据库中使用不同的排序规则字符集。

下面的示例将您的排序规则和字符集更改为utf32。小心,一定要备份数据库以防止任何数据丢失!此操作可能导致部分或全部数据丢失:

ALTER DATABASE your_db_name
CHARACTER SET utf32]
COLLATE utf32_general_ci

你可以调整它以找到最适合你的,这取决于你在数据库中插入的数据类型。

另一个更安全的选择是在应用层上减轻它。定义一个有助于特殊字符转换的范围。

至于:;按"t"搜索但不出现";问题,看起来像是DBMS配置问题。尽管它通常适用于FULLTEXT搜索,但可能存在关于LIKE查询的最小长度的一些设置。

假设您使用的是jenssegers/laravel-mongodb,那么您可以使用->options来实现查询:

$search = $this->model
->where('name', 'like', '%'.$keyword.'%')
->options([ 
'collation' => [
'locale' => 'en',
'strength' => 1  
]
])->get()->toArray();

检查https://www.mongodb.com/docs/v5.3/reference/collation/有关排序规则选项的更多详细信息

最新更新