1

假设我有一个 Laravel 4 应用程序。假设我有一个填充的电影表。

这个:

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

返回这个:

Braveheart
Silent Hill
The Big Lebowski
Waterworld

不过,我想要的是忽略排序中的“the”以返回:

The Big Lewbowski
Braveheart
Silent Hill
Waterworld

Laravel 中有什么东西可以让这变得简单吗?你会如何处理这个问题?我需要编写自定义 SQL 查询吗?

谢谢!

4

3 回答 3

3

你好,你好

将结果存储在数组中。循环遍历数组并删除所有“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

而已

于 2013-10-06T15:44:20.470 回答
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();

代替

编辑仅在您可以使用的字符串的开头搜索“The”CASELEFT检查“The”的出现

 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();
于 2013-10-06T16:00:12.110 回答
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函数的另一个答案也可能足够好,但 noteREPLACE将替换所有出现的目标字符串(例如“乱世佳人”将被更改。

于 2013-10-06T16:46:48.287 回答