【问题标题】:how to select count with a difference condition in laravel如何在laravel中选择具有差异条件的计数
【发布时间】:2018-04-25 10:03:43
【问题描述】:

我有这个数据库结构

table tools     table details
-----------     -------------
id *            id *
name            balance_shoot
                tool_id

我需要计算 tools 的计数,它在 tool_details 中的 balance_shoot 小于或等于零(危险)且大于零(保存)。类似的东西:

[ 
  danger_count => 0,
  save_count   => 5
];

我已经做到了:

public function index(Request $request){
    $trans_date = date('Y-m-d');

    $tools = Tool::select('id')
    ->whereHas(
        'details' , function ($query) use ($trans_date){
            $query->where('trans_date', $trans_date );
        }
    )
    /*->with([
        'details' => function ($query) use ($trans_date){
            $query->where('trans_date', $trans_date );
        }
    ])*/
    ->withCount([
        'details as danger' => function ($query) use ($trans_date){
            $query->where('trans_date', $trans_date )->where('balance_shoot', '<=', 0 );
        },      

        'details as save' => function ($query) use ($trans_date){
            $query->where('trans_date', $trans_date )
            ->where('balance_shoot', '>', 0 );
        },
    ]);

    return $tools->get();

}

它返回这个:

 "tools": [
    {
        "id": 101,
        "danger_count": "0",
        "save_count": "1"
    },
    {
        "id": 102,
        "danger_count": "0",
        "save_count": "1"
    }
 ];

我怎样才能得到那个数据结构,但在一个单一的结果返回??

【问题讨论】:

    标签: php laravel eloquent


    【解决方案1】:

    SQL 查询

    select count(*) total, sum(case when balance_shoot < '0' then 1 else 0 end) danger, sum(case when balance_shoot > '0' then 1 else 0 end) safe from tool_dtl group by tool_id
    

    在 Laravel 你可以试试这个

    <?php 
    $toolDtl = Detail::select(
        array(
            DB::raw('COUNT(*) as total'),
            DB::raw("SUM(CASE 
                WHEN balance_shoot < '0' THEN 1 ELSE 0 END) AS danger"),
            DB::raw("SUM(CASE
                WHEN balance_shoot > '0' THEN 1 ELSE 0 END) AS save")
        )
    )
    ->groupBy('tool_id')
    ->orderBy('id', 'asc')->get();
    ?>
    

    【讨论】:

    • 谢谢。你引导我走向正确的方向。除了我只是不需要 groupBy 子句
    【解决方案2】:

    我们可以直接使用条件SUM进行计数

    Detail::select([
            DB::raw('COUNT(*) as total'),
            DB::raw("SUM(balance_shoot < '0') AS danger"),
            DB::raw("SUM(balance_shoot > '0') AS save")
    ])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多