子查詢

當我想要計算子查詢的數量時,會想要執行像下方的 SQL 查詢語法

SELECT count(*)
FROM (
    SELECT UID
    FROM `posts`
    WHERE `status` = 1
    GROUP BY `user_id`
) sub

在 Eloquent 可以用下面方式達到子查詢的目的

<?php

// Eloquent Builder instance
$SubQuery = Posts::where('status', 1)
    ->groupBy('user_id');

$count = DB::table( DB::raw("({$SubQuery->toSql()}) as sub") )
    ->mergeBindings($SubQuery->getQuery())
    ->count();

記得當你的子查詢結束後,若有更多的條件需要執行,則必須將查詢條件放在 mergeBindings() 方法後方,否則原本 SubQuery 的查詢資料順序會綁定錯誤

$count = DB::table( DB::raw("({$SubQuery->toSql()}) as sub") )
    // ->where(..) 這裡會出錯
    ->mergeBindings($SubQuery->getQuery())
    // ->where(..) 正確
    ->count();

Laravel v5.6.12 (2018-03-14) 之後,加入了 fromSub()fromRaw() 的方法可以直接產生子查詢語法

<?php
DB::query()->fromSub(function ($query) {
    $query->from('posts')
        ->where('status', 1)
        ->groupBy('user_id');
}, 'sub')->count();

// select count(*) as aggregate from (select * from `abc` group by `col1`) as `a`

參考資料

KeJyun 最新新書推薦
- Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站
- Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。

雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。

本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。

Laravel 5 for beginner 新手道場:優雅運用框架快速開發 PHP 網站

購書連結

Laravel框架开发详解:从零基础到运用框架快速开发PHP网站

購書連結

comments powered by Disqus