Php Laravel Eloquent/SQL-在数据库中搜索关键字

Php Laravel Eloquent/SQL-在数据库中搜索关键字,php,mysql,sql,laravel,eloquent,Php,Mysql,Sql,Laravel,Eloquent,我目前正试图在我的数据库中实现关键字/标记的搜索 在我的数据库中,我有几行关键字,如: 汽车、cabrio、frischluft或 软管,牛仔裤,布劳软管,克莱东 所以总是有些关键字基本上也可以有一个空格,用逗号分隔 现在我希望能够在我的数据库中找到一个输入了一些关键字的产品 有了LIKE,我可以找到我提到的两个条目,包括auto、cabrio或cabrio、frischluft或hose、jeans、blau或hose、kleidung。但是,如果我进入自动,frischluft或类似软管,b

我目前正试图在我的数据库中实现关键字/标记的搜索

在我的数据库中,我有几行关键字,如: 汽车、cabrio、frischluft或 软管,牛仔裤,布劳软管,克莱东

所以总是有些关键字基本上也可以有一个空格,用逗号分隔

现在我希望能够在我的数据库中找到一个输入了一些关键字的产品

有了LIKE,我可以找到我提到的两个条目,包括auto、cabrio或cabrio、frischluft或hose、jeans、blau或hose、kleidung。但是,如果我进入自动,frischluft或类似软管,blaue软管或牛仔裤,kleidung,会发生什么

那我就不工作了。有办法做到这一点吗

我希望你明白我的意思

因此,我要明确一点:我目前使用的代码是: $searchQuery=%。$request->input'productSearch'。%; $products=Product::where'name','LIKE',$searchQuery->paginate15

但正如我所说的,如果输入产品搜索中输入了关键字auto,frischluft,那么这不会让我返回带有keyowrds auto,cabrio,frischluft的文章


有什么想法吗?

关于您刚才的答复:

如果您想让它更简单,请阅读以下MySQL文档:

基本上,在一个文件中,你可以grep为[,]?blaue hose[,]?查找:可选逗号、字符串“blaue hose”和可选逗号

我的初步答案是更为坚实的解决方案:

实际上,您可以创建一个关键字表,具体取决于您的products表,其中每个关键字短语/关键字 它本身在一列中,甚至在关键字短语/关键字上建立索引。我在这里解释这个原则:

以您的示例作为输入—下面是我在Vertica中如何做到这一点的。许多数据库提供了一个返回 由您选择的字符分隔的字符串的第n部分/标记。在Vertica,它是分裂的一部分

不幸的是,MySQL不提供与该函数的任何对应关系,您必须将下面WITH子句中的公共表表达式转换为行内SELECT-s SELECT。。。从选择。。。作为foocol1、col2、col3。。。。。然后,Daniel Vassallo就如何解决这一问题提出了建议:

在Vertica,它看起来是这样的:

WITH 
-- input
products(prod_id,keywords) AS (
          SELECT 1001,'auto,cabrio,frischluft'
UNION ALL SELECT 1002,'hose,jeans,blaue hose,kleidung'
)
,
-- index to get the n-th part of the comma delimited string
max_keyword_count(idx) AS (
          SELECT 1
UNION ALL SELECT 2
UNION ALL SELECT 3
UNION ALL SELECT 4
UNION ALL SELECT 5
)
SELECT
  prod_id
, idx
, TRIM(SPLIT_PART(keywords,',',idx)) AS keywords
FROM products
CROSS JOIN max_keyword_count
WHERE SPLIT_PART(keywords,',',idx) <> ''
ORDER BY
  prod_id
, idx
;

prod_id|idx|keywords
  1,001|  1|auto
  1,001|  2|cabrio
  1,001|  3|frischluft
  1,002|  1|hose
  1,002|  2|jeans
  1,002|  3|blaue hose
  1,002|  4|kleidung

对不起,我知道我参加聚会迟到了,但这是我在谷歌搜索雄辩关键词时的第一次搜索结果。我也有同样的问题,我想帮助解决

$q = $request->input('productSearch');
$needles = explode(',', $q);

// In my case, I wanted to split the string when a comma or a whitespace is found:
// $needles = preg_split('/[\s,]+/', $q);

$products = Products::where('name', 'LIKE', "%{$q}%");

foreach ($needles as $needle) {
    $products = $products->orWhere('name', 'LIKE', "%{$needle}%");
}

$products = $products->paginate(15);
如果用户输入的逗号太多,则$Piners数组可能太大,查询可能太大,因此您可以限制搜索,例如,仅搜索数组中的前5个元素:

$needles = array_slice($needles, 0, 5);

我希望这能帮助某人。

谢谢你的回答,但这听起来很难。。有没有更简单的方法可以做到这一点?在这种情况下,请阅读以下MySQL文档:。基本上,在一个文件中,你可以grep为[,]?blaue hose[,]?查找:一个可选的逗号,字符串'blaue hose',和一个可选的逗号。但这基本上也是LIKE应该做的,不是吗?因为我怎么能在使用软管的时候使用你的想法呢?应该以关键词hose,jeans,blaue hose,Kleidung作为产品的结尾,如果您的意思是提供一个关键字列表作为输入,并希望在“hose,jacke,jeans,blaue hose”中搜索“hose,blaue hose”,找到匹配项,那么这不是您可以问的SQL问题。您必须以编程方式将搜索条件转换为WHERE关键字(如“%hose%”或关键字(如“%blaue hose%”)。好的,您可能是对的,但如果我使用或像您现在建议的那样,我会在问题中运行,也会有只包含hose或blaue hose,但不同时包含两者的结果。但我想你明白我的意思了。我有一个带有关键字列表的产品,然后我希望能够将关键字列表传递给搜索字段,并且我希望找到包含所有关键字的产品,这些关键字都是从搜索框传递的,无论它们是以何种顺序为产品保存的