可批量赋值字段 */ protected $fillable = [ 'order_no', 'merchant_order_no', 'user_id', 'vip_level_id', 'status', 'amount', 'subject', 'payment_order_no', 'provider', 'provider_trade_no', 'vip_name', 'vip_duration_days', 'sync_return_payload', 'async_notify_payload', 'paid_at', 'opened_vip_at', 'meta', ]; /** * 属性类型转换 * * @return array */ protected function casts(): array { return [ 'amount' => 'decimal:2', 'vip_duration_days' => 'integer', 'sync_return_payload' => 'array', 'async_notify_payload' => 'array', 'meta' => 'array', 'paid_at' => 'datetime', 'opened_vip_at' => 'datetime', ]; } /** * 关联:支付订单所属用户 */ public function user(): BelongsTo { return $this->belongsTo(User::class, 'user_id'); } /** * 关联:支付订单对应的 VIP 等级 */ public function vipLevel(): BelongsTo { return $this->belongsTo(VipLevel::class, 'vip_level_id'); } /** * 判断订单是否已经完成支付 */ public function isPaid(): bool { return $this->status === 'paid'; } /** * 判断订单是否已经完成会员开通 */ public function isVipOpened(): bool { return $this->opened_vip_at !== null; } }