如何优先考虑laravel雄辩的结果

时间:2017-09-01 02:43:33

标签: 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 = '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%');

但上面的代码,似乎没有..

2 个答案:

答案 0 :(得分:4)

我认为您想要对结果进行排序的逻辑应该出现在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;

<强>输出:

enter image description here

以下是我尝试使用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的任何(工作)文档,因此我使用了字符串连接。

在这里演示:

Rextester

答案 1 :(得分:1)

不是一个好的解决方案,但这可能对你有帮助,

$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,然后使用它们的联合来获取数据。

如果您想通过UNION处理此问题,原始查询会是什么样子:

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

这里需要注意的是,如果给定记录对于两个或更多标题,描述或标记列具有相同的值,那么最终会出现结果集中出现的重复记录。从您的原始数据来看,这似乎并没有发生,尽管这是一个值得一提的优势。