2013-01-22 30 views
18

Tôi khá mới đối với truy vấn Laravel và Fluent. Tôi có một truy vấn để chọn tất cả các hàng từ bảng thuê và hiển thị chúng theo thứ tự ngẫu nhiên.Truy vấn thông thạo Laravel - Làm cách nào để tôi thực hiện 'CHỌN AS' bằng Fluent?

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

bây giờ tôi muốn để có thể làm là đặt

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

vào phần SELECT của truy vấn, vì vậy mà tôi có thể chọn * từ bảng và một mô tả ngắn lại.

Tôi biết điều này là có thể bằng cách chạy truy vấn thô, nhưng tôi đã hy vọng có thể thực hiện việc này bằng cách sử dụng Thông thạo hoặc ít nhất một phần Thông thạo (như trên).

Bất kỳ trợ giúp hoặc ý tưởng nào?

Cảm ơn Adam.

+0

Tương đương nguyên của truy vấn 'DB :: '(tiêu đề SELECT, url, hình ảnh, concat (SUBSTRING_INDEX (mô tả, "", 25), "...") Mô tả AS, danh mục FROM hire_bikes ORDER BY RAND() '); ' –

+0

Bạn có thể chỉnh sửa câu hỏi của mình. ;) Bằng cách này, thông thường bạn làm logic như vậy trong mô hình, nếu không bạn sẽ mất đi lợi ích của việc sử dụng thông thạo (là DBMS-thuyết bất khả tri) và bạn có thể truy vấn thô ngay từ đầu, tiết kiệm thời gian cho bạn. – dualed

+0

Truy vấn của nó tôi chỉ cần chạy trên một trang, vì vậy không cần thiết phải ở trong một mô hình, nó không có tham gia hay phụ thuộc vv ... Tôi biết nó dễ dàng thực hiện thông qua truy vấn thô và nhanh chóng, tôi chỉ hy vọng tìm hiểu thêm về các phương thức Fluent và xem liệu có thể chọn nhiều cột mà không chọn tất cả các cột hay không. Lưu loát chỉ xuất hiện để cho bạn có 1 cột HOẶC tất cả các cột, thật đáng tiếc! –

Trả lời

20

Bạn có thể thực hiện việc này bằng cách thêm DB::raw() vào một mảng chọn trong truy vấn thông thạo của mình. Tôi đã thử nghiệm này tại địa phương và nó hoạt động tốt.

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

Ít thanh lịch hơn câu trả lời của Steves :) – Sam

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

Bạn thực sự có thể sử dụng chọn AS mà không sử dụng DB::raw(). Chỉ cần chuyển một mảng vào phương thức select() như sau:

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

Đã thử nghiệm ngay bây giờ.

EDIT:

Ngoài ra tôi muốn đề nghị không nên sử dụng một truy vấn DB:raw() để thực hiện một concat của lĩnh vực mô tả của bạn. Nếu bạn đang sử dụng một mô hình hùng hồn, bạn có thể sử dụng accessors & mutatators để thực hiện điều này cho bạn vì vậy nếu bạn cần một mô tả hạn chế, bạn có thể chỉ cần xuất nó trong chế độ xem của bạn và không phải sử dụng cùng một truy vấn mỗi lần để có được một mô tả hạn chế. Ví dụ:

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

Theo quan điểm của bạn:

@foreach($books as $book) 

    {{ $book->limited_description }} 

@endforeach 

Kết quả ví dụ (không chính xác để hạn chế):

The description of this book is... 

EDIT # 2:

Tôi muốn cũng khuyên không nên sử dụng mặt tiền DB vì nó luôn sử dụng kết nối mặc định của bạn. Nếu bạn đang truy vấn kết nối thứ cấp, nó sẽ không tính đến điều này trừ khi bạn chủ động chỉ định nó bằng cách sử dụng:

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

Điều này đáng lẽ phải được trao giải đáp, vì đề xuất một giải pháp không liên quan đến raw() – Mawg

+3

Bạn thậm chí không phải sử dụng một mảng. Chỉ đơn giản là chuyển nó như một tham số như: 'Car :: select ('brand_name AS brand', 'color', 'mã lực AS hp') -> first();'. Bạn có thể làm điều này vì việc lấy các tham số hàm ('$ columns') trong' select' được thực hiện theo cách này: '$ this-> columns = is_array ($ columns)? $ cột: func_get_args(); '. – totymedli

+0

Cảm ơn @totymedli, tôi đã thêm câu trả lời này vào câu trả lời. –

Các vấn đề liên quan