2013-07-14 79 views
9

我的員工和組表之間有很多關係。我創建了數據透視表,並且所有的工作都正常。但是,我在僱員表上有一個sortOrder列,用於確定它們顯示的順序。在sortOrder列中值爲1的員工應該是第一位,值2應該是第二位,依此類推。 (如果按降序排序,則向後)sortOrder列是允許空值的整數列。如何使用Laravel中的雄辯最後對NULL值進行排序

我已經設置了我的組模型來按排序列排序員工,但我遇到了問題。空值始終首先顯示。我試過使用ISNULL和類似的SQL方法來取代常用的「asc」或「desc」,但我只是得到一個錯誤。

下面是我的組模型的代碼:

class Group extends Eloquent { 

public function employees() 
    { 
     return $this->belongsToMany("Employee")->orderBy('sortOrder', 'asc'); 
    } 
} 

這裏就是我在控制器中使用它來訪問我的模型:

$board = Group::find(6)->employees; 

是什麼在Laravel來排序NULL值持續的伎倆?

回答

5
public function employees() 
{ 
    return $this 
     ->hasMany('Employee') 
     ->select(['*', DB::raw('IF(`sortOrder` IS NOT NULL, `sortOrder`, 1000000) `sortOrder`')]) 
     ->orderBy('sortOrder', 'asc'); 
} 

說明:
IF語句在這裏解決了這個問題。如果找到NULL值,則將一些大號碼分配給sortOrder。如果發現不是NULL值,則使用實際值。

+0

謝謝!這完美的作品!我不知道流暢的連鎖方法可以用於雄辯。 – eagle0042

+0

你能告訴我選擇中括號的重要性嗎?我對他們有一個奇怪的問題。我有兩臺開發計算機,其中一個與括號沒有問題,另一個引發FatalErrorException。我把它們拿出來了,現在它在兩臺計算機上都能正常工作,而且我的查詢結果似乎沒有改變。 – eagle0042

+0

傳遞給'select()'方法的括號不過是數組的新語法。 您遇到問題,因爲此功能是新增功能,附帶PHP 5.4。其中一臺電腦運行5.4,另一臺電腦不運行。 看到http://php.net/manual/en/language.types.array.php或http://php.net/manual/en/migration54.new-features.php – Andreyco

2

而不是依靠一個任意大量的你也可以做的:

public function employees() 
{ 
    return $this 
     ->hasMany('Employee') 
     ->select(['*', DB::raw('sortOrder IS NULL AS sortOrderNull')]) 
     ->orderBy('sortOrderNull') 
     ->orderBy('sortOrder'); 
} 

它有一個額外的好處被SQLite的支持。

-1
->orderBy('sortOrder', 'is', 'null')->orderBy('sortOrder', 'asc') 

似乎工作。

+0

實際上,它會創建一個查詢,它包含'sortOrder DESC,sortOrder ASC'的順序,它最後不會添加NULL值。 – junkystu

+0

@junkystu:你是如何驗證的?我還沒有設法使SQL日誌工作。我使用Eloquent 5.0 btw。 –

+1

使用[調試欄](https://github.com/barryvdh/laravel-debugbar),它非常好,甚至可以讓你看到通過ajax和其他有用的東西運行的查詢 – junkystu

13

但是,Laravel沒有考慮ISNULL方法,但是您可以將它作爲原始查詢傳遞並仍然使用,因爲它比if語句和結果保持不變,如果超出1000000員工,如下所示:

public function employees() 
{ 
    return $this->hasMany('Employee') 
       ->orderBy(DB::raw('ISNULL(sortOrder), sortOrder'), 'ASC'); 
} 
+0

這也是工作的解決方案也不是數字值,如日期。 –

21

只需在字段中添加一個減號並將順序更改爲DESC即可。

$q->orderBy(\DB::raw('-`sortOrder`'), 'desc'); 
+6

對於laravel 5.1: $ q-> orderBy(\ DB :: raw(' - sortOrder'),'desc'); – Blum

+3

對於Laravel 5.4:$ q-> orderByRaw(「 - start_date」,'DESC') –

0

甲PostgreSQL的

解決方法對於數值類型:

DB::table('t') 
    ->select(['id', 'val']) 
    ->orderBy(DB::raw("coalesce(val, 0)"), 'desc') 

對於文本類型:

orderBy(DB::raw("coalesce(val, '')"), 'desc') 

訣竅是在分揀列替換NULL值爲零(或空字符串),以便它可以按普通整數(或文本)值排序。

1

在Laravel 5.2或更高版本中,請致電orderByRaw。你甚至可以通過聚合值而不是列進行排序。在以下示例中,如果沒有子模型,則max_st可以是null

Model::where('act', '2') 
    ->leftJoin('submodels', 'model.id', '=', 'submodels.model_id') 
    ->select('models.*', DB::raw('MAX(submodels.st) as max_st')), 
    ->orderByRaw('max_st DESC NULLS LAST');