2016-08-04 52 views
0

所以laravel雄辯是每個查詢......這對我來說是一個很大的問題,因爲在大多數情況下,我需要的數據,以通過id desc更改默認ORDER BY從ASC到DESC全球所有查詢

進行排序使用 id asc爲默認

我不認爲它只是我......你幾乎總是希望新的行顯示在視圖的列表頂部。

是否其新聞或用戶列表或博客文章。

詛咒我可以使用->orderBy('id' , 'desc'),但如果我必須爲每個單一的查詢寫這個,我想我會需要在每個項目後看到收縮!

所以我正在尋找一個乾淨的方式,而不需要添加一些東西給每個模型...顯然有Global Scopes,但我需要添加id到每個模型,我是興奮考慮它作爲計劃B 。

因此,即時通訊尋找改變這個全球性的每一個查詢...有沒有辦法,或者我應該去計劃B!?

+0

你應該去計劃B –

+0

看看這個線程:http://stackoverflow.com/questions/20701216/laravel-default-orderby –

+1

@JesúsAmieirothanx,我已經看到了這一點,它建議使用全球範圍,已經在我的問題中掩蓋了 – max

回答

1

您可以更改默認Laravels ORDERBY

/** 
* Add an "order by" clause to the query. 
* 
* @param string $column 
* @param string $direction 
* @return $this 
*/ 
public function orderBy($column, $direction = 'asc') 
{ 
    $this->{$this->unions ? 'unionOrders' : 'orders'}[] = [ 
     'column' => $column, 
     'direction' => strtolower($direction) == 'asc' ? 'asc' : 'desc', 
    ]; 
    return $this; 
} 

在/vendor/laravel/framework/src/Illuminate/Database/Query/Builder.php

變化:

public function orderBy($column, $direction = 'asc') 

到:

public function orderBy($column, $direction = 'desc') 

@Grzegorz Gajda是正確的,但你不應該編輯Laravel代碼。最好的解決辦法是使用Laravel,因爲它的設計,當你想降:

->orderBy('id' , 'desc'); 
+0

爲什麼要投票? – cmac

+2

您不應編輯外部依賴項,特別是Laravel代碼。有人想要將Laravel更新到新版本時會發生什麼? –

+0

你是對的,我編輯了我的答案。 – cmac

0

難道你不能只是簡單地使自己的查詢功能,並呼籲->orderBy('id' , 'desc')?我想不出任何其他解決方案。

0

你的目的,你可以使用自定義BaseClass將定義默認orderBy屬性遞減,然後你可以擴展你的模型在此類而不是Model類。

自BaseClass的:
模型:

class BaseClass extends Model{ 
protected static function boot() { 
    parent::boot(); 
    static::addGlobalScope('order', function (Builder $builder) { 
     $builder->orderBy($builder->column,'desc'); 
    }); 
    } 
} 

然後,所有你想要通過desc實現順序模型,這個BaseClass擴展它

class abcModel extends BaseModel{ 
//Your code 
} 

要刪除的默認行爲只需使用:

abcModel::withoutGlobalScope('order')->get();