使用 laravel eloquent 关系的 GroupBy

GroupBy from relations using laravel eloquent

我有 TypeOfVehicle 个模型,其中有很多 Vehicle
我如何按车辆名称类型对所有车辆进行计数以获得类似这样的结果

[
   'Sedan'     => 10,
   'SUV'       => 25,
   'Crossover' => 5
]

您可以使用

$counts = DB::table('tablename')
                 ->select('TypeOfVehicle', DB::raw('count(*) as total'))
                 ->groupBy('TypeOfVehicle')
                 ->get();

统计相关模型

如果您想计算一个关系的结果数量而不实际加载它们,您可以使用 withCount 方法,该方法会在您的结果模型上放置一个 {relation}_count 列。

$typeOfVehicles = App\TypeOfVehicle::withCount('vehicles')->get();

foreach ($typeOfVehicles as $typeOfVehicle) {
    echo $typeOfVehicle->vehicles_count;
}

试试这个,它会为您提供解决方案

$vehicle=Vehicle::all();
        $grouped = $vehicle->groupBy(function ($item, $key) {
            return substr($item['that_coloumn_name_like_type'], 0);
        });
        $groupCount = $grouped->map(function ($item, $key) {
            return collect($item)->count();
        });
//dd($groupCount);  to check it work correctly

我假设您在 Vehicle 模型中有 eloquent 关系 type,例如:

public function type()
{
    return $this->belongsTo('\App\TypeOfVehicle');
}

因此,您可以通过以下方式获取数据:

$result = Vehicle::select('vehicle_type_id', DB::raw('count(vehicle_type_id) as cnt'))
    ->with('type') // with your type relation
    ->groupBy('vehicle_type_id') // group by type of vehicle
    ->get() // get collection from database
    ->pluck('cnt', 'type.name') // get only needful data
    ->toArray(); // cast to array if necessary