Laravel Lighthouse:向BelongsToMany关联的Pivot传递两个值
问题解决:BelongsToMany关联向中间表传递多个额外字段报错的处理
问题场景
Laravel项目中,通过BelongsToMany关联给中间表(Pivot表)传递两个额外字段时,触发「第二个字段无默认值」的数据库报错,但单独传递其中一个字段时完全正常。项目使用GraphQL定义接口,同时配置了Eloquent关联和自定义Pivot模型,移除关联里的->using(自定义Pivot模型)后功能恢复,最终排查出是自定义Pivot模型的$fillable字段导致的问题,移除该字段即可解决。
相关代码示例
1. GraphQL Schema定义
type Mutation { attachItemToCollection(collectionId: ID!, itemId: ID!, extra1: String!, extra2: String!): Boolean }
2. GraphQL Mutation处理代码
public function resolveAttachItemToCollection($root, $args) { $collection = Collection::findOrFail($args['collectionId']); $collection->items()->attach( $args['itemId'], ['extra1' => $args['extra1'], 'extra2' => $args['extra2']] ); return true; }
3. Eloquent模型关联配置
// Collection模型中的关联方法 public function items() { return $this->belongsToMany(Item::class) ->using(CollectionItemPivot::class) ->withPivot('extra1', 'extra2'); }
4. 报错的自定义Pivot模型(含$fillable)
class CollectionItemPivot extends Pivot { // 只允许extra1字段填充,导致extra2被拦截 protected $fillable = ['extra1']; }
5. 修复后的自定义Pivot模型(移除$fillable)
class CollectionItemPivot extends Pivot { // 移除$fillable,让Pivot默认支持所有中间表字段的赋值 }
问题原因
自定义Pivot模型里的$fillable是白名单机制,只有数组内的字段能被批量赋值。当传递两个额外字段时,第二个字段不在$fillable列表中,Laravel会阻止写入,而数据库中该字段没有设置默认值,因此触发报错。移除$fillable后,Pivot模型默认允许所有中间表字段的赋值操作,两个字段就能正常写入中间表了。
内容的提问来源于stack exchange,提问作者NoahNxT
相关产品推荐
相关产品推荐

