2013-10-06 5 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 Query вы можете использование REPLACE

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

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

Для Laravel 4 надежды, так это работает, но не уверена, что

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

REPLACE

EDIT Поиск «The» только в начальной строке вы можете использовать CASE и LEFT проверить внешний вид в книгах «»

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 находится посередине. Так не хорошо! – 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 не нуждается в этом. Он интеллектуальный и имеет один из самых продвинутых ORM в мире PHP под названием Eloquent. Проверьте его и попросите RAW-запросы. – Smalbil

+0

@Netbulae, как бы вы написали этот точный запрос с Laravel Eloquent? –

+0

Вы бы поставили регистр внутри оператора select. На подобный вопрос был дан ответ: [Laravel eloquent select case] (http://stackoverflow.com/questions/17092112/laravel-eloquent-select-case) – Smalbil

Смежные вопросы