如何通过在 Laravel 5.7 中的同一列中执行不同的查询来创建不同的别名

How to create different aliases by doing different queries in the same column in Laravel 5.7

我在存储索引的 MySQL 中有一个 table,我需要通过为每个计数带一个别名来计算一列索引。

我尝试了以下代码,但它不起作用,而且由于我是 Laravel 的新手,我不确定如何构建此查询

$data = Baralho::select(
        DB::raw("YEAR(data_entrada) as ano"),
        DB::raw("count(id_situacao) as inseridos, id_situacao"),
        DB::raw("count(id_situacao = 2) as presos"),
        DB::raw("count(id_situacao = 3) as mortos"),
        DB::raw("count(id_situacao = 4) as retirados")
    )->groupBy("ano")->get();
    $geral[] = ['Ano', 'Inseridos', 'Presos', 'Mortos', 'Retirados'];
    //$anos = $data->pluck('ano');
    foreach($data as $key => $value){
        $geral[++$key] = [$value->ano, $value->inseridos, $value->presos, $value->mortos, $value->retirados ];
    }
    dd($geral);

我需要它来计算索引和 return 每个别名的结果,例如,如果在列 id_situacao 中索引是 2 它会计算所有 2 个索引并且给我带别名 presos 的结果,这样我就可以将这些结果插入我的数组 $geral[]

dd($geral) Result

编辑:
我尝试使用以下代码:

$data = DB::select(
            DB::raw('(SELECT YEAR(data_entrada) as ano FROM baralho)'),
            DB::raw('(SELECT count(id_situacao) as inseridos FROM baralho)'),
            DB::raw('(SELECT count(id_situacao) as presos FROM baralho WHERE id_situacao = 2)'),
            DB::raw('(SELECT count(id_situacao) as mortos FROM baralho WHERE id_situacao = 3)'),
            DB::raw('(SELECT count(id_situacao) as retirados FROM baralho WHERE id_situacao = 4)')
        )->groupBy('ano')->get();;
        $geral[] = ['Ano', 'Inseridos', 'Presos', 'Mortos', 'Retirados'];
        //$anos = $data->pluck('ano');
        //dd($anos);
        foreach($data as $key => $value){
            $geral[++$key] = [$value->ano, $value->inseridos, $value->presos, $value->mortos, $value->retirados];
            //dd($value);
        }
        dd($geral);

但我收到错误消息:

Symfony \ Component \ Debug \ Exception \ FatalThrowableError (E_RECOVERABLE_ERROR) Argument 1 passed to Illuminate\Database\Connection::prepareBindings() must be of the type array, object given, called in /home/.../.../...com/.../vendor/laravel/framework/src/Illuminate/Database/Connection.php on line 328

你的解释对我来说不是很清楚,但我想我明白你想要什么。试试这个:

$data = Baralho::select(
    DB::raw("YEAR(data_entrada) as ano"),
    DB::raw("count(id_situacao) as inseridos, id_situacao"),
    DB::raw("count(id_situacao = 2) as presos"),
    DB::raw("count(id_situacao = 3) as mortos"),
    DB::raw("count(id_situacao = 4) as retirados")
)->groupBy("ano")->get();

$geral = [];
//$anos = $data->pluck('ano');
foreach($data as $key => $value){
    $geral[++$key] = ['Ano' => $value->ano, 'Inseridos' => $value->inseridos, 'Presos' => $value->presos, 'Mortos' => $value->mortos, 'Retirados' => $value->retirados ];
}

好吧,我能够通过以下方式解决我的问题:

$data = Baralho::select(
            DB::raw("YEAR(data_entrada) as ano"),
            DB::raw("count(id_situacao) as inseridos, id_situacao"),
            DB::raw("count(case when id_situacao = 2 then 1 end) as presos"),
            DB::raw("count(case when id_situacao = 3 then 1 end) as mortos"),
            DB::raw("count(case when id_situacao = 4 then 1 end) as retirados")
        )->groupBy("ano")->get();
        $geral[] = ["Ano", "Inseridos", "Presos", "Mortos", "Retirados"];
        foreach($data as $key => $value){
            $geral[++$key] = [$value->ano, $value->inseridos, $value->presos, $value->mortos, $value->retirados ];
        }  

只有使用 CASE 子句,我才能通过按 id 分组并为每种类型返回别名来计算 id_situacao 字段