优雅地使用 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中文网其他相关文章!