You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 05:09:00