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

如何在Laravel中实现商品上架10天后自动取消新品标识

Laravel电商商品新品标识自动取消实现方案

针对商品添加日期起10天后自动取消新品标识的需求,提供三种可行的实现方案,你可以根据业务场景选择:

方案一:Laravel定时任务(推荐批量处理场景)

通过后台定时任务批量更新过期商品的新品状态,数据持久化修改,适合后台统计、报表等依赖数据库状态的场景。

实现步骤:

  1. 确认商品表字段:确保商品表(如products)包含is_new(布尔型,存储是否为新品)和created_at(时间戳,商品添加日期)字段。
  2. 生成定时任务类:
    php artisan make:command CancelExpiredNewProducts
    
  3. 编写任务逻辑:打开生成的app/Console/Commands/CancelExpiredNewProducts.php,修改handle方法:
    <?php
    
    namespace App\Console\Commands;
    
    use App\Models\Product;
    use Carbon\Carbon;
    use Illuminate\Console\Command;
    
    class CancelExpiredNewProducts extends Command
    {
        protected $signature = 'products:cancel-expired-new';
        protected $description = '取消添加超过10天的商品新品标识';
    
        public function handle()
        {
            $tenDaysAgo = Carbon::now()->subDays(10);
    
            Product::where('is_new', true)
                ->where('created_at', '<=', $tenDaysAgo)
                ->update(['is_new' => false]);
    
            $this->info('已完成过期新品标识取消操作');
        }
    }
    
  4. 注册定时任务:在app/Console/Kernel.php的schedule方法中添加任务调度,比如每天凌晨2点执行:
    protected function schedule(Schedule $schedule)
    {
        $schedule->command('products:cancel-expired-new')->dailyAt('02:00');
    }
    
  5. 配置服务器Cron:确保服务器上的Cron服务运行,添加以下Cron条目(替换项目路径):
    * * * * * cd /path/to/your/laravel/project && php artisan schedule:run >> /dev/null 2>&1
    

方案二:模型访问器(适合实时展示场景)

无需修改数据库,通过模型访问器动态判断商品是否仍属于新品,前端或业务逻辑调用时自动计算状态,实时准确。

实现步骤:

在App\Models\Product模型中添加访问器:

<?php

namespace App\Models;

use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    // 动态返回是否为新品
    public function getIsNewAttribute($value)
    {
        // 仅当数据库标记为新品且创建时间在10天内,才返回true
        return $value && $this->created_at->diffInDays(Carbon::now()) <= 10;
    }
}

使用时直接调用$product->is_new即可获取实时状态,即使数据库中is_new为true,只要超过10天就会返回false。

方案三:延迟队列任务(精准到期处理)

当管理员标记商品为新品时,创建一个延迟10天的队列任务,到期后自动取消新品标识,精准对应单个商品的到期时间。

实现步骤:

  1. 生成队列任务类:
    php artisan make:job CancelNewProductStatus
    
  2. 编写任务逻辑:打开app/Jobs/CancelNewProductStatus.php:
    <?php
    
    namespace App\Jobs;
    
    use App\Models\Product;
    use Illuminate\Bus\Queueable;
    use Illuminate\Contracts\Queue\ShouldQueue;
    use Illuminate\Foundation\Bus\Dispatchable;
    use Illuminate\Queue\InteractsWithQueue;
    use Illuminate\Queue\SerializesModels;
    
    class CancelNewProductStatus implements ShouldQueue
    {
        use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    
        protected $product;
    
        public function __construct(Product $product)
        {
            $this->product = $product;
        }
    
        public function handle()
        {
            // 双重校验,避免中途状态被修改或商品删除
            if ($this->product->is_new && $this->product->created_at->diffInDays(now()) >= 10) {
                $this->product->update(['is_new' => false]);
            }
        }
    }
    
  3. 调度延迟任务:在管理员标记商品为新品的业务逻辑中,添加队列调度:
    // $product为当前标记新品的商品实例
    $product->update(['is_new' => true]);
    // 延迟10天后执行任务
    CancelNewProductStatus::dispatch($product)->delay(now()->addDays(10));
    
  4. 启动队列Worker:确保队列服务运行,执行:
    php artisan queue:work
    
    (生产环境建议使用Supervisor等工具守护进程)

内容的提问来源于stack exchange,提问作者xmr6204

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 14:40:15