Laravel中能否在Eloquent的select查询内用foreach动态生成统计字段?
这个需求完全可以实现,核心逻辑是先把所有查询字段拼装为数组,再统一传入Eloquent的select方法即可,具体实现代码如下:
// 定义产品类型映射关系,后续新增类型直接在这里更新即可 $productType = [ 'productNew' => 1, 'productHot' => 2, 'productDefective' => 3 ]; $productId = 1; // 初始化select字段数组,先放入固定查询的字段 $selectColumns = [ 'product_type', DB::raw('count(*) as total'), DB::raw("DATE_FORMAT(created_at, '%Y-%m-%d') as date") ]; // 循环动态添加SUM统计字段 foreach ($productType as $key => $type) { // 若类型值来自外部用户输入,建议用参数绑定写法避免SQL注入: // $selectColumns[] = DB::raw('SUM(product_type = ?) as ' . $key, [$type]); $selectColumns[] = DB::raw('SUM(product_type = ' . $type . ') as ' . $key); } // 执行查询 $product = Product::select($selectColumns) ->where('product_id', $productId) ->groupBy('date', 'product_type') ->get() ->toArray();
注意事项
- 如果
$productType数组的键名是来自用户输入的动态值,需要对键名做合法性校验,建议提前定义允许的键名白名单,避免SQL语法错误 - 如果
$productType的类型值来自用户输入,务必使用参数绑定的写法,不要直接拼接SQL字符串
内容的提问来源于stack exchange,提问作者deskeay
相关产品推荐
相关产品推荐

