我正在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
作为teo
或t
时,它返回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/有关排序规则选项的更多详细信息