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

Laravel中如何手动设置或维护created_at与updated_at字段

手动指定Laravel模型的created_at/updated_at值

方法1:直接在create方法中传入时间字段

如果你的StockInfo模型已经将created_at和updated_at加入$fillable属性,创建数据时直接传入这两个字段的值即可,无需后续二次修改保存:

$stock = Stock::find(20);
$stockInfo = $stock->stockInfos()->create([
    'order_id' => $orderId,
    'customer_id' => $customerId,
    'detail' => "Edit Order",
    'stock_in' => $sum_or_deduct === 'sum' ? (int) $item['quantity'] : null,
    'stock_out' => $sum_or_deduct === 'deduct' ? (int) $item['quantity'] : null,
    'balance' => $openingBalance,
    'new_balance' => $openingBalance,
    'old_balance' => $closingBalance,
    'created_at' => $order->created_at, // 手动指定创建时间
    'updated_at' => $order->created_at  // 手动指定更新时间
]);

关键前提:需要在StockInfo模型中把这两个字段加入批量赋值白名单,否则会被Laravel拦截:

class StockInfo extends Model
{
    protected $fillable = [
        // 其他业务字段...
        'created_at',
        'updated_at'
    ];
}

方法2:关闭自动时间戳后手动赋值保存

如果不想修改模型的$fillable,可以先创建模型实例,关闭自动时间戳功能后再赋值保存:

$stock = Stock::find(20);
// 创建未保存的模型实例
$stockInfo = new StockInfo([
    'order_id' => $orderId,
    'customer_id' => $customerId,
    'detail' => "Edit Order",
    'stock_in' => $sum_or_deduct === 'sum' ? (int) $item['quantity'] : null,
    'stock_out' => $sum_or_deduct === 'deduct' ? (int) $item['quantity'] : null,
    'balance' => $openingBalance,
    'new_balance' => $openingBalance,
    'old_balance' => $closingBalance,
]);
// 关闭自动更新时间戳
$stockInfo->timestamps = false;
// 手动设置时间字段
$stockInfo->created_at = $order->created_at;
$stockInfo->updated_at = $order->created_at;
// 关联保存到数据库
$stock->stockInfos()->save($stockInfo);

方法3:使用forceCreate跳过批量赋值验证

如果不想修改$fillable,也可以用forceCreate方法直接传入所有字段(包括时间字段),绕过批量赋值的验证:

$stock = Stock::find(20);
$stockInfo = $stock->stockInfos()->forceCreate([
    'order_id' => $orderId,
    'customer_id' => $customerId,
    'detail' => "Edit Order",
    'stock_in' => $sum_or_deduct === 'sum' ? (int) $item['quantity'] : null,
    'stock_out' => $sum_or_deduct === 'deduct' ? (int) $item['quantity'] : null,
    'balance' => $openingBalance,
    'new_balance' => $openingBalance,
    'old_balance' => $closingBalance,
    'created_at' => $order->created_at,
    'updated_at' => $order->created_at
]);

优化你当前的代码

你现在的代码存在冗余操作:先调用create触发一次保存,后续又修改字段再save一次。上面的三种方法都能避免这种重复操作,更高效地完成需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 18:35:24