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
相关产品推荐
相关产品推荐

