2013-10-06 121 views
1

假設我有一個Laravel 4應用程序。我們還要說我有一個人口稠密的電影表。按字母順序排列查詢結果,但在排序中排除「該」?

此:

$movies = Movie::orderBy('title', 'ASC')->get(); 

返回此:

Braveheart 
Silent Hill 
The Big Lebowski 
Waterworld 

我想要什麼,雖然,是無視 「中的」 在排序返回此:

The Big Lewbowski 
Braveheart 
Silent Hill 
Waterworld 

Laravel裏面有什麼可以讓這個變得簡單嗎?你會如何處理這個問題?我是否需要編寫自定義SQL查詢?

謝謝!

回答

1

你好你的好日子

將結果保存到一個數組。 循環遍歷數組並刪除所有'The'。

事情是這樣的:

$str = "The quick brown fox jumps over the lazy dog." 
if(substr($str, 0, 4) = 'The ') 
{ 
    $str2 = substr($str, 4); // "quick brown fox jumps over the lazy dog." 
} 

創建從上面的東西,一個新的陣列。

然後做這樣的事情:

<?php 

$fruits = array("lemon", "orange", "banana", "apple"); 
sort($fruits); 
foreach ($fruits as $key => $val) { 
    echo "fruits[" . $key . "] = " . $val . "\n"; 
} 
?> 

這將按照字母順序進行排序:

fruits[0] = apple 
fruits[1] = banana 
fruits[2] = lemon 
fruits[3] = orange 

完蛋了

1

不確定laravel 4的語法,但在MySQL查詢即可使用REPLACE

REPLACE(column, 'search', 'replace') 

SELECT * FROM `movies` ORDER BY REPLACE(`title`, 'The', '') 

對於laravel 4的希望所以它的工作原理,但不知道

$movies = Movie::orderBy("REPLACE(`title`, 'The', '')", "ASC")->get(); 

REPLACE

編輯搜索「」只有在字符串的開始,你可以使用CASELEFT檢查appearence的「的」

SELECT * FROM `movies` ORDER BY 
CASE WHEN LEFT(`title`,4) ='The ' 
THEN REPLACE(`title`, 'The ', '') 
ELSE `title` 
END 

$movies = Movie::orderBy("CASE WHEN LEFT(`title`,4) ='The ' 
THEN REPLACE(`title`, 'The ', '') 
ELSE `title` 
END", "ASC")->get(); 
+0

它將刪除所有匹配的內容。即使The The在中間。所以不好! – Smalbil

+0

@Netbulae對訂購而言無關緊要,如果在字符串之間出現或在結尾 –

1

我也不知道Laravel任何東西,但這種查詢可以做你想做的:

SELECT title 
FROM movies 
ORDER BY 
    CASE 
     WHEN SUBSTRING(title FROM 1 FOR 4) = 'The ' 
     THEN SUBSTRING(title,5) 
     ELSE title 
    END DESC 

對方回答指REPLACE功能也可能不夠好,但要注意REPLACE將取代「亂世佳人」的目標字符串(例如所有出現將改變。

+0

Laravel不需要那些東西。它是智能的,並且擁有PHP世界中稱爲Eloquent的最先進的ORM之一。檢查一下,並說出好的RAW查詢。 – Smalbil

+0

@Netbulae你會如何用Laravel雄辯來寫這個精確的查詢? –

+0

你會把案例放在select語句中。類似的問題已經在這裏得到解答:[Laravel雄辯選擇案例](http://stackoverflow.com/questions/17092112/laravel-eloquent-select-case) – Smalbil