laravel crm 可用 groupby('status') 配合 count(*) 一次统计各状态的客户数量。要让图表顺序稳定,先定义允许显示的状态,再把没有记录的状态补成 0。
让报表入口使用现有权限
在 routes/web.php 接入已有控制器。假定 CRM 已实现 crm.view-report 权限,且这个报表面向有权查看全量数据的单组织后台。
use App\Http\Controllers\CustomerReportController;
use Illuminate\Support\Facades\Route;
Route::get('/crm/reports/customer-status', [CustomerReportController::class, 'status'])
->middleware(['auth', 'can:crm.view-report']);
多组织应用还需要在统计查询中使用当前组织的范围。
用分组统计后补零
假定 customers.status 使用 new、contacted、won。把以下方法加到 CustomerReportController。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
public function status()
{
$counts = ['new' => 0, 'contacted' => 0, 'won' => 0];
$rows = \Illuminate\Support\Facades\DB::table('customers')
->whereIn('status', array_keys($counts))
->select('status')
->selectRaw('COUNT(*) AS total')
->groupBy(\'status\')
->pluck('total', 'status');
foreach ($rows as $status => $total) {
$counts[$status] = (int) $total;
}
return response()->json($counts);
}
数据库驱动返回的计数可能是字符串。转为整数后,前端可直接使用数值。
用没有记录的状态验证补零
在隔离测试库准备两条 new 和一条 won,contacted 不插入记录。用有权限账号访问报表。
{
"new": 2,
"contacted": 0,
"won": 1
}响应应包含三个键。无权限账号应被拒绝,前端无需凭空补一个状态。

















