Laravel 5.0获取attach操作后中间表插入行ID问题
获取多对多关联中间表的行ID
这个问题我之前也碰到过,Laravel的attach()方法默认确实不会返回中间表的行ID——它的设计初衷只是执行关联插入操作,没有预设返回值,所以你拿到null是正常的。下面给你两种解决方案,根据你的Laravel版本来选择:
方案一:Laravel 8.42+ 版本(推荐)
从Laravel 8.42版本开始,attach()方法新增了第三个可选参数returnPivot,将它设为true后,方法会返回对应的Pivot模型实例,你直接通过实例就能拿到中间表的ID:
$newsletter = Newsletter::findOrFail($newsletterId); // 第三个参数设为true,返回pivot模型 $pivot = $newsletter->blocks()->attach($blockId, [], true); // 输出中间表行ID dd($pivot->id);
这里第二个参数是你要插入到中间表的额外字段(如果有的话),如果没有额外字段就传空数组[]即可。
方案二:低版本Laravel(8.42以下)
如果你的Laravel版本低于8.42,可以通过两种方式获取中间表ID:
方式1:直接查询中间表
执行attach()后,直接用DB门面查询中间表的最新关联记录:
$newsletter = Newsletter::findOrFail($newsletterId); $newsletter->blocks()->attach($blockId); // 假设中间表名为newsletter_block(Laravel默认的多对多表命名规则) $pivotId = DB::table('newsletter_block') ->where('newsletter_id', $newsletterId) ->where('block_id', $blockId) ->latest('id') // 避免重复关联时拿到旧记录,取最新的一条 ->value('id'); dd($pivotId);
方式2:通过关联模型的pivot属性查询
如果你的模型关联里定义了Pivot模型(或者默认的Pivot),可以先刷新关联,再获取pivot对象:
$newsletter = Newsletter::findOrFail($newsletterId); $newsletter->blocks()->attach($blockId); // 刷新关联并获取对应的block模型,再取pivot属性 $block = $newsletter->blocks()->where('block_id', $blockId)->first(); dd($block->pivot->id);
注意:如果允许同一个Block多次关联到同一个Newsletter,这种方式可能拿到旧的关联记录,建议搭配latest()使用更稳妥。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

