Laravel 8如何存储循环生成值并返回聚合数据 仅返回单值问题咨询
问题原因
return语句会直接终止当前方法的执行,所以第一次匹配到过期产品的时候,就直接把当前的$days返回了,不会继续执行后续循环。而echo仅输出内容不会终止程序运行,所以能打印所有匹配结果。
修复后的代码
你可以先把所有符合条件的结果存入数组,循环结束后统一返回:
public function index() { $take_data = Product::whereNotNull('expiry_date')->select('expiry_date','name')->get(); $today_date = strtotime(date('Y-m-d')); // 初始化空数组存储所有过期提示 $expiredList = []; foreach($take_data as $product) { $expiry_date = strtotime($product->expiry_date); if($expiry_date < $today_date) { $result = abs($today_date - $expiry_date); $years = floor( $result / (365*60*60*24)); $months = floor(( $result - $years * 365*60*60*24) /(30*60*60*24)); $days = $product->name." : Expired ". floor(( $result - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24))." days ago. "; // 把单条结果追加到数组中 $expiredList[] = $days; } } // 循环结束后统一返回所有结果,可根据需要返回数组或拼接为字符串 return $expiredList; }
Laravel 适配优化方案
你可以直接在查询阶段过滤已过期产品,减少数据集大小提升性能,同时用Laravel自带的日期处理工具简化代码:
public function index() { $today = now()->toDateString(); // 直接在SQL层过滤已过期产品 return Product::whereNotNull('expiry_date') ->whereDate('expiry_date', '<', $today) ->select('expiry_date','name') ->get() ->map(function($product) { $expiredDays = now()->parse($product->expiry_date)->diffInDays(now()); return "{$product->name} : Expired {$expiredDays} days ago."; })->toArray(); }
内容的提问来源于stack exchange,提问作者th tom
相关产品推荐
相关产品推荐

