Laravel MongoDB中BelongsToMany自定义关联键无法工作如何解决?
解决方案
1. 修正关联方法的参数配置
Jenssegers MongoDB 的 belongsToMany 方法需要明确指定关联模型的自定义键,以及中间集合(或嵌入字段)对应的键名:
Book.php 模型
public function authors() { return $this->belongsToMany( Author::class, null, // 若使用默认中间集合名(如author_book)可留空,否则指定集合名 'book_ids', // 中间集合中指向Book的外键 'user_ids', // 中间集合中指向Author的外键 '_id', // Book模型的主键(MongoDB默认是_id) 'user_id' // Author模型用于关联的自定义键(替换默认的id) ); }
Author.php 模型
public function books() { return $this->belongsToMany( Book::class, null, 'user_ids', // 中间集合中指向Author的外键 'book_ids', // 中间集合中指向Book的外键 'user_id', // Author模型用于关联的自定义键 '_id' // Book模型的主键 ); }
2. 确保attach传入正确的键值
调用 attach 时,传入的 $userIds 必须是Author模型的user_id字段值,而非默认的id值:
// 示例:$userIds需为['user_123', 'user_456']这类Author的user_id值 $book->authors()->attach($userIds);
3. 检查中间集合(若使用)
如果使用独立的中间集合而非嵌入数组,需确保集合结构正确:
- 集合包含
book_ids和user_ids字段,类型需与对应模型的键类型匹配(如MongoDB的ObjectId或字符串) - 若存在遗留数据,需确认数据格式与新关联配置一致
4. 验证关联是否生效
通过以下代码测试关联查询是否正常:
// 查询某本书的关联作者 $authors = $book->authors; // 查询某作者的关联书籍 $books = Author::where('user_id', $userId)->first()->books;
内容的提问来源于stack exchange,提问作者wivku
相关产品推荐
相关产品推荐

