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::selectSub
là raw 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();
Xin vui lòng, dù sao để làm điều đó với hùng hồn mà không sử dụng DB :: raw()? –