2017-09-01 59 views
1

我有一個4列的表。我想根據輸入顯示行,並且應該能夠根據優先級字段優先顯示。如何確定結果的優先級laravel雄辯

例如:我的表看起來像這樣:

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%'); 

但上面的代碼,似乎它沒有..

回答

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 

一個需要注意這裏要說的是,如果給定的記錄有相同的值,兩個或兩個以上的稱號,說明或標籤列,那麼最終會出現重複記錄出現在結果集中。從您的原始數據看,這似乎沒有發生,儘管這是一個值得一提的邊緣案例。

+0

你有邏輯的人,但我認爲這會工作過慢,如果你有幾百萬個數據的 – smzapp

+0

我想你也將需要一個'ORDER BY'條款在這裏做這個工作。您可以將一個計算列添加到您的'UNION'查詢中,以跟蹤每個子查詢,然後在最後按該列排序。 –

+0

@samuel是的絕對,這就是爲什麼我提到「不是一個好的解決方案」 –

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

這是我在什麼Laravel代碼看起來像使用orderByRaw嘗試:

$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