優雅地使用 Laravel 查詢建構器從子查詢中選擇資料
在最近的一個專案中,您使用 Eloquent ORM 從資料庫中檢索資料。其中一個需求是使用子查詢來計算特定列中的記錄數。以下是您嘗試執行的 SQL 查詢:
<code class="language-sql">SELECT COUNT(*) FROM (SELECT * FROM abc GROUP BY col1) AS a;</code>
您第一次嘗試使用 Abc 模型的 from()
和 groupBy()
方法:
<code class="language-php">$sql = Abc::from('abc AS a')->groupBy('col1')->toSql(); $num = Abc::from(\DB::raw($sql))->count(); print $num;</code>
但是,您正在尋找更優雅的解決方案。
完整的解
Laravel 查詢建構器沒有直接的方法可以在 FROM 子句中建立子查詢。因此,您需要手動建構原始 SQL 語句。為此,您可以使用以下方法:
<code class="language-php">$sub = Abc::where(...)->groupBy(...); // Eloquent Builder 实例 $count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) ->mergeBindings($sub->getQuery()) // 合并所有绑定 ->count();</code>
為了確保結果準確,請務必按照正確的順序合併綁定。如果您有其他綁定的子句,則應將其放在 mergeBindings()
之後:
<code class="language-php">$count = DB::table( DB::raw("({$sub->toSql()}) as sub") ) // ->where(...) 错误的位置 ->mergeBindings($sub->getQuery()) // 合并绑定 // ->where(...) 正确的位置 ->count();</code>
此解決方案提供了一種簡單有效的方法來執行包含複雜條件和綁定的子查詢。
以上是如何使用 Laravel 的查詢產生器從子查詢中優雅地進行選擇?的詳細內容。更多資訊請關注PHP中文網其他相關文章!