gpt4 book ai didi

php - 根据 LIKE 出现次数进行排序 Laravel Php

转载 作者:行者123 更新时间:2023-12-03 08:30:40 25 4
gpt4 key购买 nike

目前我的网站上有一个简单的搜索引擎

我正在尝试匹配所有字段中的关键字

这是简化的工作代码

$keyword_search = "Hello World";
$delimeter = ' '; //or your separator
$keywords = explode($delimeter, $keyword_search);

$base_query = \App\Models\EntireSearchSite::where('id','!=',NULL);

foreach($keywords as $keyword){
$base_query->where(function($query) use ($keyword){
$query->where('part_number', 'like', '%' . $keyword . '%')
->orWhere('part_name', 'like', '%' . $keyword . '%')
->orWhere('category', 'like', '%' . $keyword . '%')
->orWhere('description', 'like', '%' . $keyword . '%');
});

}

$data = $base_query->paginate(20);
return $data;

我想要做的是匹配所有关键字,对所有匹配的关键字进行计数(对于每次出现),并从最高出现次数到最低出现次数进行Order By Desc

如果我输入“Hello World”

它将找到与“Hello World”匹配的所有数据

我有part_number、part_name、category、description字段

它将对所有字段中出现的总数进行求和,并按从最高到最低 (DESC) 的顺序排列 ORDER BY

示例:

数据#1

part_number 中匹配的关键字数量为 0

part_name中匹配的关键字数量为2

类别中匹配的关键字数量为0

描述中匹配的关键字数量为0

总计 = 2

数据#2

part_number 中匹配的关键字数量为 0

part_name中匹配的关键字数量为0

类别中匹配的关键字数量为2

描述中匹配的关键字数量为10

总计 = 12

数据 #3

part_number 中匹配的关键字数量为 0

part_name中匹配的关键字数量为0

类别中匹配的关键字数量为0

描述中匹配的关键字数量为5

总计 = 5

按 desc 排序应该是这样的

数据#2

数据#3

数据#1

更新*

尝试了@Anas的答案

$delimeter = ' '; //or your separator
$keywords = explode($delimeter, $keyword_search);

$base_query = \App\Models\EntireSearchSite::where('id','!=',NULL);

foreach($keywords as $keyword){
$base_query->where(function($query) use ($keyword){
$query->where('part_number', 'like', '%' . $keyword . '%')
->orWhere('part_name', 'like', '%' . $keyword . '%')
->orWhere('category', 'like', '%' . $keyword . '%')
->orWhere('description', 'like', '%' . $keyword . '%');
});
}

foreach($keywords as $keyword){
$base_query->selectRaw(function($querySelect) use ($keyword){
$querySelect->selectRaw('
Round ((Char_length(Concat(
part_number,
part_name,
category,
description

)) - Char_length(REPLACE ( Concat(
part_number,
part_name,
category,
description
), "'.$keyword.'", ""))) / Char_length("'.$keyword.'")) AS count
');

});
}

$data = $base_query->orderBy('count','DESC')->paginate(20);
return $data;

但是我得到了未定义的列数

更新

@Donkarnash 的应用答案

enter image description here

enter image description here

最佳答案

由于在循环中使用selectRaw,计数操作的别名不应该是count(对循环的所有迭代重复)。相反,它应该是 'count'.$keyword 以使其成为唯一的别名。

类似地,也应在循环内定义 orderBy(),以便对 'count'.$keyword 列进行 orderBy。

$base_query = \App\Models\EntireSearchSite::where('id','!=',NULL);

foreach($keywords as $keyword){
$base_query->where(function($query) use ($keyword){
$query->where('part_number', 'like', '%' . $keyword . '%')
->orWhere('part_name', 'like', '%' . $keyword . '%')
->orWhere('category', 'like', '%' . $keyword . '%')
->orWhere('description', 'like', '%' . $keyword . '%');
});
}

foreach($keywords as $keyword) {
$base_query->selectRaw('
Round (
(Char_length(Concat(email, name)) - Char_length(REPLACE ( Concat(email,name), "' . $keyword .'", ""))
) / Char_length("' . $keyword .'")
) AS count' . $keyword
)
->orderBy("count$keyword", "desc");
}

$data = $base_query->paginate(20);
return $data;

关于php - 根据 LIKE 出现次数进行排序 Laravel Php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65260015/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com