在 Laravel 9 中,Eloquent 集合对象(如 $signups)即使为空也会被 PHP 视为“真值”,导致 if($signups) 恒成立;应改用 if(!$signups->isEmpty()) 显式判断空集合,并注意变量作用域(如 $sortorder 需在每个分支中独立初始化)。
在
laravel
9 中,eloquent 集合对象(如 `$signups`)即使为空也会被 php 视为“真值”,导致 `if($signups)` 恒成立;应改用 `if(!$signups->isempty())` 显式判断空集合,并注意变量作用域(如 `$sortorder` 需在每个分支中独立初始化。
Laravel 9 对 PHP 类型判断更为严格,尤其在处理 Eloquent 集合(Illuminate\Database\Eloquent\Collection)时,其底层已不再是简单数组,而是一个对象实例。这意味着传统 PHP 的“空数组为 falsy”逻辑不再直接适用:if($signups) 在 Laravel 9 中
始终为 true
,哪怕 $signups->count() === 0 或 $signups->isEmpty() === true —— 因为集合对象本身不为 null、false 或空字符串,PHP 将其视为 truthy。
✅ 正确写法:使用 isEmpty() 显式判断
⚠️ 同样适用于 $teams 分支
? 核心要点总结
永远不要用 if($collection) 判断 Eloquent 集合
:它不是数组,是对象,PHP 的 loose comparison 会失效。
统一使用 !$collection->isEmpty()
:语义清晰、兼容 Laravel 5.3–10+。
变量作用域不可跨分支共享
:$sortorder = 0 必须在每个 if 块内显式初始化,否则 Laravel 9 的严格作用域检查会抛出 Undefined variable。
避免 if(!$teamIds[0] == '') 这类易错写法
:推荐 !empty($teamIds) && $teamIds[0] !== '' 或更安全的 collect($teamIds)->filter()->isNotEmpty()。
升级提示
:Laravel 9 默认启用 PHP 8.0+,对未定义变量、类型隐式转换更敏感,建议开启 strict_types=1 并全面使用 ?Collection 类型提示增强可维护性。
通过以上调整,即可彻底解决“本不该进入的 if 分支被误执行”问题,确保发票仅在真实存在签到或队伍数据时生成。
Laravel 13.2.0
PHP中文网提供Laravel 13.2.0版本下载,Laravel框架 是基于 PHP 8.3+ 的高性能框架,官方推荐通过 Composer 安装。它内置 AI SDK、JSON:API Resources 及原生向量搜索,支持属性驱动开发与队列路由,大幅提升开发效率。相比旧版,13.2.0 优化了缓存 TTL 管理与实时通信,无需 Redis 即可横向扩展。作为现代 Web 开发首选,它兼顾安全与极速体验,助您快速构建企业级应用。
下载
$signups = $query->get();
// ❌ 错误:空集合仍进入分支(Laravel 9 行为)
// if ($signups) { ... }
// ✅ 正确:显式检查是否为空集合
if (!$signups->isEmpty()) {
$invoice = new \App\Models\Invoice;
$invoice->created_by = \Auth::id();
$invoice->recipient_id = $club->id;
$invoice->recipient_type = 'App\Models\Club';
$invoice->sender_id = $sender->id;
$invoice->sender_type = $type;
$invoice->sender_name = $sender->name;
$invoice_nr = \App\Models\Invoice::GenerateInvoiceNumber($type, $sender->id);
$invoice->invoice_nr = $invoice_nr;
$invoice->invoice_reference = $sender->id . date('Y') . $invoice_nr;
$invoice->save();
$sortorder = 0; // ✅ 必须在此处初始化(作用域限定)
foreach ($signups as $signup) {
$sortorder++;
$invoice->expiration_date = max(
$invoice->expiration_date ?? null,
$signup->Competition->signups_closing_date
);
$invoice->InvoiceRows()->create([
'description' => sprintf(
'%s %s %s (%s)',
$signup->User->full_name,
$signup->Competition->name,
$signup->Competition->date,
$signup->Competition->championships_id
? $signup->Weaponclass->classname_general
: $signup->Weaponclass->classname
),
'quantity' => 1,
'unit' => _('st'),
'net_unit_amount' => $signup->registration_fee,
'vat_percent' => 0,
'vat_amount' => 0,
'row_net_amount' => $signup->registration_fee,
'row_vat_amount' => 0,
'row_sum_amount' => $signup->registration_fee,
'sortorder' => $sortorder
]);
$invoice->Signups()->save($signup);
}
$invoice->amount = $invoice->InvoiceRows()->sum('row_sum_amount');
$invoice->expiration_date = max(
$invoice->expiration_date ?? date('Y-m-d'),
date('Y-m-d')
);
$invoice->save();
$invoices->push($invoice);
}// ✅ 正确:先确保 $teamIds 是有效非空数组,再查询
if (!empty($teamIds) && $teamIds[0] !== '') {
$query = \App\Models\Team::with('Competition', 'Weapongroup')
->whereIn('teams.id', $teamIds)
->orderBy('competitions_id')
->orderBy('name')
->where(function ($q) use ($club, $sender, $type) {
$q->whereNull('invoices_id');
$q->where('clubs_id', $club->id);
$q->whereHas('Competition', function ($cq) use ($sender, $type) {
$cq->where('invoices_recipient_type', $type);
$cq->where('invoices_recipient_id', $sender->id);
});
});
$teams = $query->get();
if (!$teams->isEmpty()) {
$invoice = new \App\Models\Invoice;
// ... 其他字段赋值(略)
$invoice_nr = \App\Models\Invoice::GenerateInvoiceNumber($type, $sender->id);
$invoice->invoice_nr = $invoice_nr;
$invoice->invoice_reference = $sender->id . date('Y') . $invoice_nr;
$invoice->save();
$sortorder = 0; // ✅ 关键:每个分支必须独立声明 $sortorder!
foreach ($teams as $team) {
$sortorder++;
$invoice->expiration_date = max(
$invoice->expiration_date ?? null,
$team->Competition->signups_closing_date
);
$invoice->InvoiceRows()->create([
'description' => sprintf(
'%s: %s %s %s (%s)',
_('Lag'),
$team->name,
$team->Competition->name,
$team->Competition->date,
$team->Weapongroup->name
),
'quantity' => 1,
'unit' => _('st'),
'net_unit_amount' => $team->registration_fee,
'row_sum_amount' => $team->registration_fee,
'sortorder' => $sortorder
]);
$invoice->Teams()->save($team);
}
$invoice->amount = $invoice->InvoiceRows()->sum('row_sum_amount');
$invoice->expiration_date = max(
$invoice->expiration_date ?? date('Y-m-d'),
date('Y-m-d')
);
$invoice->save();
$invoices->push($invoice);
}
}