Php 如何在laravel雄辩中优先考虑结果
我有一个4列的表。我想根据输入显示行,它应该能够根据优先级字段显示优先级 示例:我的表格如下所示:Php 如何在laravel雄辩中优先考虑结果,php,sql,laravel,eloquent,Php,Sql,Laravel,Eloquent,我有一个4列的表。我想根据输入显示行,它应该能够根据优先级字段显示优先级 示例:我的表格如下所示: ID title description tags 1 web developer designer front-end 2 designer front-end web developer 3 front-end web developer designer 下面是我的测试用例,它应该如何工作: $input
ID title description tags
1 web developer designer front-end
2 designer front-end web developer
3 front-end web developer designer
下面是我的测试用例,它应该如何工作:
$input = 'web developer' // the sequence should be IDs : 1, 3, 2
$input = 'front-end' // output sequence result is : 3, 2, 1
$input = 'designer' // result sequence : 2, 1, 3
现在,我想对结果进行优先级排序,从标题到输入中的标记
$blog = DB::('blogs')
->where('title', 'LIKE', '%$title%')
->where('description', 'LIKE', '%$title%')
->where('tags', 'LIKE', '%$title%');
但是上面的代码,似乎不是…不是一个好的解决方案,但这可能会帮助您
$input = 'web developer';
$byTitle = DB::('blogs')
->where('title', 'LIKE', '%$input%')
->select('id');
$byDescription = DB::('blogs')
->where('description', 'LIKE', '%$input%')
->select('id');
$byTag = DB::('blogs')
->where('tag', 'LIKE', '%$input%')
->select('id');
$ids = $byTitle->union($byDescription)->union($byTag)->get();
您可以根据列选择id,然后将它们合并以获取数据
如果您希望通过联合处理此问题,则原始查询的外观如下所示:
SELECT ID, 1 AS priority
FROM blogs
WHERE title = 'web developer'
UNION
SELECT ID, 2
FROM blogs
WHERE description = 'web developer'
UNION
SELECT ID, 3
FROM blogs
WHERE tags = 'web developer'
ORDER BY
priority,
ID
这里需要注意的一点是,如果给定记录的两个或多个title、description或tags列的值相同,那么结果集中会出现重复的记录。从您的原始数据来看,这似乎没有发生,尽管这是一个值得一提的边缘案例。我认为您想要对结果排序的逻辑应该出现在order BY
子句中。考虑下面的原始查询:
SELECT *
FROM yourTable
ORDER BY
CASE WHEN title = 'web developer' THEN 0 ELSE 1 END,
CASE WHEN description = 'web developer' THEN 0 ELSE 1 END,
CASE WHEN tags = 'web developer' THEN 0 ELSE 1 END;
输出:
下面是我使用orderByRaw对Laravel代码的尝试:
$orderByClause = "CASE WHEN title = '".$input."' THEN 0 ELSE 1 END,";
$orderByClause .= "CASE WHEN description = '".$input."' THEN 0 ELSE 1 END,";
$orderByClause .= "CASE WHEN tags = '".$input."' THEN 0 ELSE 1 END";
$blog = DB::('blogs')
->orderByRaw($orderByClause)
->get();
我找不到任何关于如何参数化orderByRaw
的文档,所以我使用了字符串连接
此处演示:
你有逻辑人,但我认为如果你有数百万数据,这将工作得太慢。我认为你还需要一个orderby
子句来完成这项工作。您可以将一个计算列添加到您的UNION
查询中,以跟踪每个子查询,然后在末尾按该列排序。@samuel是的,这就是为什么我提到“不是一个好的解决方案”@TimBiegeleisen我认为将逐个执行三个不同的查询,因此,将计算出所需的结果。谢谢你的帮助suggestion@SagarGautam我用您可能在MySQL中使用的实际原始查询更新了您的答案。我认为您需要引入一个计算列来跟踪每个批次的位置。