2013-01-22 59 views
18

我對Laravel和Fluent查詢很新。 我有一個查詢來選擇聘用表中的所有行,並以隨機順序顯示它們。Laravel Fluent查詢 - 我如何使用Fluent執行'SELECT AS'?

DB::table('hire_bikes')->order_by(\DB::raw('RAND()'))->get(); 

現在我希望能夠做的就是把

concat(SUBSTRING_INDEX(description, " ",25),"...") AS description 

到查詢的SELECT部分​​,這樣我可以從表中選擇和縮短說明*。

我知道這是可能的通過運行原始查詢,但我希望能夠做到這一點使用流利或至少部分流利(像上面)。

任何幫助或想法?

謝謝 亞當。

+0

原因等同於後面的是什麼是DB :: query('SELECT title,url, image,concat(SUBSTRING_INDEX(description,「」,25),「...」)AS描述,category FROM hire_bikes ORDER BY RAND()');' –

+0

您可以編輯您的問題。 ;)順便說一下,通常你會在模型中執行這樣的邏輯,否則你將失去使用流利的好處(與DBMS無關),並且你可以首先進行原始查詢,節省時間。 – dualed

+0

它的查詢我只需要在一個頁面上運行,所以不需要它在模型中,它沒有連接或依賴關係等......我知道它通過原始查詢很容易完成,並且一樣快,我是隻是希望瞭解更多關於Fluent方法的信息,看看是否可以選擇多列而不選擇全部。流利只會讓你有1列或所有列,這是一個恥辱! –

回答

20

您可以通過在流利查詢中將一個DB::raw()添加到select數組來完成此操作。我在本地測試這個,它工作正常。

DB::table('hire_bikes') 
    ->select(
     array(
     'title', 
     'url', 
     'image', 
     DB::raw('concat(SUBSTRING_INDEX(description, " ",25),"...") AS description'), 
     'category' 
    ) 
    ) 
    ->order_by(\DB::raw('RAND()')) 
    ->get(); 
+0

遠不如斯蒂夫斯優雅的回答:) – Sam

0
select(array(DB::raw('latitude as lat'), DB::raw('longitude as lon'))) 
19

您實際上可以使用選擇AS不使用DB::raw()。只是傳遞一個數組到select()方法,像這樣:

$event = Events::select(['name AS title', 'description AS content'])->first(); 

// Or just pass multiple params 

$event = Events::select('name AS title', 'description AS Content'); 

$event->title; 
$event->content; 

剛纔測試。

編輯:

而且我建議對使用DB:raw()查詢來執行你的描述字段的CONCAT。如果您使用的是雄辯模型,則可以使用accessors & mutatators來爲您執行此操作,因此如果您需要有限的描述,則只需將其輸出到視圖中,而不必每次都使用相同的查詢來獲取有限的描述。例如:

class Book extends Eloquent 
{ 
    public function getLimitedDescriptionAttribute() 
    { 
     return str_limit($this->attributes['description'], $limit = 100, $end = '...'); 
    } 
} 

在視圖:

@foreach($books as $book) 

    {{ $book->limited_description }} 

@endforeach 

輸出示例(不準確限制):

The description of this book is... 

EDIT#2:

我想還建議不要使用數據庫門面,因爲它總是利用您的默認連接。如果你正在查詢一個輔助連接,除非你主動指定它:

DB::connection('secondary')->table('hire_bikes')->select(['name as title'])->get(); 
+1

這應該已經被授予答案,建議一個解決方案,不涉及raw() – Mawg

+3

你甚至不必使用數組。只需簡單地將它作爲參數傳遞,如:Car :: select('brand_name AS brand','color','horsepower AS hp') - > first();'。你可以這樣做,因爲在'select'中檢索函數參數('$ columns')是這樣完成的:'$ this-> columns = is_array($ columns)? $ columns:func_get_args();'。 – totymedli

+0

謝謝@totymedli,我已將此添加到答案中。 –

相關問題