如何在Laravel中搜索奇怪的人物?

时间:2018-09-14 12:56:34

标签: php mysql laravel encode

我在我的网站上搜索时遇到问题。我有一个搜索输入,用于按名称查找产品。如果我输入“leña”(问题是奇怪的字符)。

这是在控制器中

result = (value1, value2, operation) -> operations.get(operation).apply(value1, value2);

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

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

搜索返回0条结果。

我确定问题是编纂,而且我不知道该如何解决。

编码为utf8mb4。

谢谢

1 个答案:

答案 0 :(得分:1)

问题并非真正出在非英语字符上。根本问题是,您将复杂的数据格式(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');

您有一个关系数据库,但尚未针对数据结构进行设计,因此您无法使用其大多数功能,包括WHEREORDER BY之类的基本功能。

您可以修复设计(请执行)或应用解决方法:

  • 如果您使用的是最新的MySQL版本,则可以在JSON type列中输入。
  • 您可以创建两个版本的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];
    

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