2013-01-22 15 views
18

Jestem całkiem nowy dla zapytań Laravel i Fluent. Mam zapytanie, aby wybrać wszystkie wiersze z tabeli najmu i wyświetlić je w losowej kolejności.Laravel Fluent Queries - Jak wykonać "SELECT AS" używając Fluent?

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

Teraz chcę być w stanie zrobić, to umieścić

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

do SELECT częścią kwerendy, tak, że można wybrać * od stołu i skróconym opisem.

Wiem, że jest to możliwe, uruchamiając surowe zapytanie, ale miałem nadzieję, że będę mógł to zrobić, używając Fluent lub przynajmniej częściowego Fluent (jak wyżej).

Każda pomoc lub pomysł?

Dzięki Adam.

+0

surowej równowartość co im po to 'DB :: query ('SELECT tytuł, url, image, concat (SUBSTRING_INDEX (description, "", 25), "...") AS description, category FROM hire_bikes ORDER BY RAND() '); ' –

+0

Możesz edytować swoje pytanie. ;) Nawiasem mówiąc, zwykle robisz taką logikę w modelu, w przeciwnym razie tracisz korzyść płynącą z używania płynnego (jako agnostyka DBMS) i możesz przejść do surowego zapytania w pierwszej kolejności, oszczędzając Twój czas. – dualed

+0

Jest to kwerenda, którą należy uruchomić tylko na jednej stronie, więc nie ma potrzeby, aby była w modelu, nie ma żadnych sprzężeń lub zależności itp. Wiem, że można to łatwo zrobić za pomocą surowego zapytania i tak samo szybko. tylko mając nadzieję dowiedzieć się więcej o metodach Fluent i sprawdzić, czy można wybrać wiele kolumn bez wybierania ich wszystkich. Wydaje się, że płynność daje ci 1 kolumnę LUB wszystkie kolumny, co jest wstydem! –

Odpowiedz

20

Możesz to zrobić, dodając DB::raw() do tablicy select w swoim płynnym zapytaniu. Testowałem to lokalnie i działa dobrze.

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

Znacznie mniej elegancko niż Steves odpowiedzieć :) – Sam

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

Rzeczywiście można używać wybierz AS bez użycia DB::raw(). Wystarczy przejść w tablicy do metody select() tak:

$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; 

Testowany właśnie teraz.

EDIT:

również sugeruję przed użyciem DB:raw() zapytanie do wykonywania concat swojego opisu pola. Jeśli używasz elokwentnego modelu, możesz użyć accessors & mutatators, aby wykonać to za Ciebie, więc jeśli kiedykolwiek będziesz potrzebować ograniczonego opisu, możesz po prostu wypisać go w widoku i nie musisz używać tego samego zapytania za każdym razem, aby uzyskać ograniczony opis. Na przykład:

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

W widoku:

@foreach($books as $book) 

    {{ $book->limited_description }} 

@endforeach 

Przykâadowa (nie dokładne ograniczyć):

The description of this book is... 

EDIT # 2:

ja odradzam także korzystanie z elewacji DB, ponieważ zawsze wykorzystuje ona domyślne połączenie. Jeśli zapytań połączenia wtórnego, nie weźmie to pod uwagę, chyba że aktywnie określić go za pomocą:

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

To powinno być przyznane odpowiedzi, dla sugestii rozwiązanie, które nie wymaga surowego() – Mawg

+3

Nie musisz nawet używać tablicy. Po prostu podaj go jako parametr taki jak: 'Car :: select ('brand_name AS brand', 'color', 'horsepower AS hp') -> first();'. Możesz to zrobić, ponieważ pobieranie parametrów funkcji ('$ columns') w' select' odbywa się w następujący sposób: '$ this-> columns = is_array ($ columns)? $ columns: func_get_args(); '. – totymedli

+0

Dzięki @totymedli, dodałem to do odpowiedzi. –