2014-11-26 19 views
7

đây là một trường hợp sử dụng đơn giản, chỉ để minh họa cho những gì tôi muốn đạt được:Laravel - Thêm cột tùy chỉnh trong chọn với hùng biện truy vấn buider

Xét truy vấn này trong SQL tinh khiết:

SELECT url, 1 AS active 
FROM `modules` 
WHERE 1 

thế nào có thể Tôi thêm cột hoạt động liên tục bằng cách sử dụng trình tạo truy vấn?

Đây là Query Builder của tôi mà không có cột thêm:

DB::table('modules') 
->get(['url']); 

Trả lời

15

đơn giản nhất là nên sử dụng DB :: liệu

 DB::table('modules')->get(['url', DB::raw('1 as active')]); 
+0

Xin vui lòng, dù sao để làm điều đó với hùng hồn mà không sử dụng DB :: raw()? –

-1

Laravel hùng biện có xây dựng truy vấn rất linh hoạt.

Bạn có thể chỉ định một cột để trở lại như:

$users = DB::table('modules')->select('1 as active')->get(['url']); 
+1

Tôi nghĩ giải pháp gần như vậy, nhưng tôi gặp lỗi SQL này khi thử giải pháp của bạn: SQLSTATE [42S22]: Cột không tìm thấy: 1054 Cột không xác định '1' trong 'danh sách trường' (SQL: chọn '1' là' hoạt động' từ 'mô-đun') – ZarkDev

+0

Điều này sẽ bỏ qua' ['url'] '. –

+0

Điều này không hoạt động. Tôi nhận được lỗi tương tự như ZarkDev.'Cột không tìm thấy: 1054 Cột không xác định '1' trong 'danh sách trường' ' – Adam

1

Chúng ta có thể thêm subquery hay "cột tùy chỉnh" trong chọn với số đầu tiên của phương pháp \Illuminate\Database\Query\Builder::selectSubraw SQL hoặc Closure hoặc \Illuminate\Database\Query\Builder. Giải pháp tốt hơn là đóng cửa hoặc Builder. Trong trường hợp của bạn nó sẽ là:

$modules = DB::table('modules')->select('url') 
    ->selectSub(function ($query) { 
     $query->selectRaw('1'); 
    }, 'active') 
    ->get(); 

Thử nghiệm trên Laravel 5.5. Trong đóng cửa $query là một đối tượng của \Illuminate\Database\Query\Builder cho truy vấn phụ. Chuẩn bị SQL sẽ là:

select `url`, (select 1) as `active` from `modules` 

Extended dụ ... Nếu chúng ta sử dụng App\Module hùng hồn cho mô-đun và chúng ta cần phải có được url của mô-đun và count của submodules của họ với id > 5, chúng ta có thể viết tiếp theo:

$modules = App\Module::select('url') 
    ->selectSub(function ($query) { 

     /** @var $query \Illuminate\Database\Query\Builder */ 
     $query->from('submodules') 
       ->selectRaw('COUNT(*)') 
       ->where('id', '>', 5) 
       ->whereRaw('`modules`.`id` = `submodules`.`module_id`'); 

    }, 'countOfSubModules') 
    ->get(); 

SQL chuẩn bị sẽ là:

select `url`, 
    (select COUNT(*) from `submodules` 
     where `id` > ? and `modules`.`id` = `submodules`.`module_id`) 
    as `countOfSubModules` 
from `modules` 

Hoặc bạn có thể viết ví dụ của bạn với sql thô:

$sql = 'SELECT 1'; 
$modules = DB::table('modules')->select('url')->selectSub($sql, 'active')->get(); 

Sau đó chuẩn bị SQL sẽ là:

select `id`, (SELECT 1) as `active` from `modules` 

Đối với có được tất cả các cột nhất thiết phải sử dụng select('*'):

App\Module::select('*')->selectSub($sql, 'text')->get(); 

Không:

App\Module::selectSub($sql, 'text')->get(); 
+0

Cân nhắc giải thích tốt hơn một chút về những gì bạn đã làm. – Ivan86

+0

Tôi xin lỗi nếu bạn đang nói về ngày của bài đăng. Tôi không nhìn thấy nó cùng một lúc. Tôi nghĩ giải pháp có thể hữu ích. Hay tôi có một sai lầm? –

+0

Tôi không nói câu trả lời của bạn không hữu ích .. Tôi chỉ nói rằng nó có thể hữu ích hơn nếu bạn giải thích những gì bạn đã làm. – Ivan86

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