Laravel条件判断异常:始终进入else分支导致价格仅减1
问题分析与解决方案
你当前代码的核心问题是使用get()获取数据库数据后直接和字符串比较,get()方法返回的是集合(Collection)对象,不是单个的时间字符串,导致所有if条件都无法匹配,最终走到else分支。
具体问题点
$usersDay1 = DB::table('gift_card_services')->select('created_at')->where('id',1)->get();
这里的get()会返回包含查询结果的集合实例,哪怕只有一条数据,它也不是字符串类型,和"2022-10-07 19:56:20"直接比较永远不相等。
修正方案
方案1:用value()直接获取单个字段值
适合你这种查询单条记录单个字段的场景,value()会直接返回目标字段的字符串值:
$reqAmount = $service->price; $useraa = auth()->user(); // 直接获取单个字段值 $usersDay1 = DB::table('gift_card_services')->where('id',1)->value('created_at'); $usersDay4 = DB::table('gift_card_services')->where('id',4)->value('created_at'); $usersDay7 = DB::table('gift_card_services')->where('id',7)->value('created_at'); if ($useraa->username == "abdoumadris") { if ($usersDay1 == "2022-10-07 19:56:20" ) { $reqAmount = ($service->price - 2); } else if ($usersDay4 == "2022-10-07 19:57:20") { $reqAmount = ($service->price - 6); } else if ($usersDay7 == "2022-10-07 19:59:00") { $reqAmount = ($service->price - 10); }else{ $reqAmount = ($service->price - 1); } }
方案2:用first()获取对象后取属性
如果需要后续使用该记录的其他字段,可以先获取整条记录对象,再访问属性:
// 获取单条记录对象 $recordDay1 = DB::table('gift_card_services')->where('id',1)->first(); // 避免记录不存在导致报错,先判断再取值 $usersDay1 = $recordDay1 ? $recordDay1->created_at : ''; // 同理处理$usersDay4、$usersDay7
额外优化:用Carbon处理时间比较
数据库的created_at如果是datetime类型,Laravel会自动转为Carbon实例,直接用字符串比较可能存在时区、毫秒精度等问题,建议用Carbon的方法精准比较:
use Carbon\Carbon; // ... if (Carbon::parse($usersDay1)->eq(Carbon::parse("2022-10-07 19:56:20"))) { $reqAmount = ($service->price - 2); }
内容的提问来源于stack exchange,提问作者Abdalkhalek Chamkha
相关产品推荐
相关产品推荐

