Laravel:关联模型时将中间表时间戳设置为指定日期而非默认创建时间
解决方案:手动指定Laravel关联中间表的时间戳值
嘿,刚好我之前也碰到过一模一样的需求,其实Laravel本身就自带了对应的解决办法,完全不用额外写扩展逻辑~
你之前尝试的链式调用withTimestamps()是用来开启关联自动时间戳功能的,但要手动指定时间戳值,只需要在attach方法里直接把这些字段作为额外属性传入就行,具体用法如下:
单个关联的场景
直接把时间戳数组作为attach的第二个参数传递:
$user->tickets()->attach($ticket->id, [ 'created_at' => '2021-01-01 00:00:01', 'updated_at' => '2021-01-01 00:00:01' ]);
因为你已经在关联定义里开启了withTimestamps(),当手动传入时间戳字段值时,Laravel会优先使用你指定的内容,而不是自动生成当前时间,完美契合你的需求。
批量关联的场景
如果需要一次性关联多个ticket,也可以用这种方式,只需要给每个ticket ID绑定对应的时间戳数据即可:
use Carbon\Carbon; $ticketIds = [1, 2, 3]; $timestampData = [ 'created_at' => Carbon::parse('2021-01-01 00:00:01'), 'updated_at' => Carbon::parse('2021-01-01 00:00:01') ]; // 给所有ticket ID设置相同的时间戳 $user->tickets()->attach(array_fill_keys($ticketIds, $timestampData));
这里用Carbon实例传递时间值会更稳妥,能自动适配数据库的时间格式,避免字符串格式不匹配导致的报错。
小补充
如果你的中间表有自定义的Pivot模型(比如UserTicket),也可以通过save方法来设置时间戳,但attach方法已经足够简洁地处理这个场景了。
内容的提问来源于stack exchange,提问作者Adam Dulson
相关产品推荐
相关产品推荐

