Laravel 6库存过期计算咨询:如何获取数据库生产日期并编写计算代码
产品过期日期计算的实现方案(含数据获取)
嘿,我来帮你理清这个问题的最佳实践~ 咱们分两部分来说:代码该放哪儿,以及怎么从数据库拿production_date。
一、计算代码的最佳存放位置:模型的访问器(Accessor)
在Laravel这类框架里,把业务逻辑(比如计算过期日期)封装在模型里是最优雅的做法——这符合MVC的设计思想,而且代码复用性极高,所有用到产品的地方都能直接用这个计算好的属性。
举个例子,假设你的模型是Product,直接在模型里写访问器:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Carbon\Carbon; class Product extends Model { // 定义「过期日期」的访问器,自动计算并返回 public function getExpiryDateAttribute() { // 这里假设你的产品表有shelf_life字段存保质期,如果是固定7天就直接写7 $shelfLife = $this->shelf_life ?? 7; // 按你的逻辑计算:生产日期 + (保质期-1)天 return Carbon::parse($this->production_date)->addDays($shelfLife - 1); } // 额外加一个「剩余天数」的访问器,视图里直接用更方便 public function getDiffDayAttribute() { return Carbon::now()->diffInDays($this->expiry_date, false); } }
为什么用访问器?因为它会自动把计算逻辑和模型绑定,你不用每次查产品都手动算一遍,直接像用普通字段一样调用$product->expiry_date就行~
如果实在不想用访问器,也可以把逻辑写在控制器里,但不推荐(逻辑分散,复用性差):
// 控制器里的写法(仅作备选) $product = Product::find($yourProductId); $shelfLife = $product->shelf_life ?? 7; $product->expiry_date = Carbon::parse($product->production_date)->addDays($shelfLife - 1); $product->diff_day = Carbon::now()->diffInDays($product->expiry_date, false);
二、从数据库获取production_date的方式
其实非常简单:当你用Eloquent查询产品时,模型会自动把数据库里的production_date字段映射成模型的属性,直接调用就行:
- 在模型里用:
$this->production_date(比如上面访问器里的写法) - 在控制器/视图里用:
$product->production_date(前提是你已经查询到了产品实例)
比如控制器里查询产品:
// 获取单个产品 $product = Product::find($productId); // 或者获取产品列表 $products = Product::all();
三、视图里怎么用?
直接调用模型的属性就行,还能结合Carbon格式化日期:
<!-- Blade视图示例 --> <div class="product-info"> <p>生产日期:{{ $product->production_date }}</p> <p>过期日期:{{ $product->expiry_date->format('Y-m-d') }}</p> <p>状态: @if($product->diff_day > 0) 还有 {{ $product->diff_day }} 天过期 @elseif($product->diff_day == 0) 今天过期! @else 已过期 {{ abs($product->diff_day) }} 天 @endif </p> </div>
内容的提问来源于stack exchange,提问作者Amirali
相关产品推荐
相关产品推荐

