如何在laravel中搜索奇怪的字符?

pinkon5k  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(345)

我的网站搜索有问题。我有一个搜索输入按名称查找产品。如果我键入'le'ñ(问题是奇怪的字符)。
这在控制器里

$termino = $_POST['search']);
 $locale = LaravelLocalization::getCurrentLocale(); //es in this case
 $products = Product::where('title', 'LIKE', "%\"{$locale}\":%{$termino}%");

这是数据库中“title”字段的内容。

{"es":"PAN DE LE\u00d1A"}

搜索返回0个结果。
我确信问题在于法典化,我不知道´我不知道怎么解决。
编码为utf8mb4。
谢谢

2ekbmq32

2ekbmq321#

我只需要在执行查询之前对字符串进行编码,例如:

// assuming that $termino is a string 
// json_encode should return the unicode representation
$search = json_encode($termino);

// I changed the where condition a bit, 
// but your own condition is also do fine
$products = Product::where('title->'.$locale, 'LIKE', '%'.$search.'%');
byqmnocz

byqmnocz2#

问题其实并不在于非英语字符。根本问题在于,您将复杂数据格式(json)存储在单个数据库单元中,而不是将数据库设计为容纳单个数据段:

create table product_title (
    product_id int(10) not null,
    locale varchar(2) not null,
    title varchar(200),
    primary key (product_id, locale)
);
insert into product_title (product_id, locale, title) values (1, 'es', 'Leña');
insert into product_title (product_id, locale, title) values (1, 'en', 'Wood');

你有一个关系数据库,但你没有围绕你的数据结构设计它,所以你不能使用它的大部分功能,包括基本的东西,如 WHERE 或者 ORDER BY .
您可以修复设计(请,执行)或应用解决方案:
如果您有一个最新的mysql版本,那么可以将 JSON 类型。
您可以创建两个版本的json数据,并期望数据库值不会有混合大小写:

$locale = 'es';
$termino = 'Leña';
$data = [
    $locale => ":%{$termino}%"
];
$ascii = json_encode($data);
$unicode = json_encode($data, JSON_UNESCAPED_UNICODE);

// Use your framework's syntax instead:
$sql = 'SELECT * FROM product WHERE title IN (:ascii, :unicode)';
$params = [$ascii, $unicode];

请注意,也没有像通配符那样使用合理的解决方法。

相关问题