Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在laravel雄辩中优先考虑结果_Php_Sql_Laravel_Eloquent - Fatal编程技术网

Php 如何在laravel雄辩中优先考虑结果

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

我有一个4列的表。我想根据输入显示行,它应该能够根据优先级字段显示优先级

示例:我的表格如下所示:

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中使用的实际原始查询更新了您的答案。我认为您需要引入一个计算列来跟踪每个批次的位置。