Laravel使用MongoDB JsonArray时Eloquent关联失效问题求助
解决Laravel MongoDB中User与Website关联返回空集合的问题
看起来你搞反了关联方向,还选错了关联类型,这就是$user->websites返回空集合的核心原因。我来一步步帮你解决:
问题根源
你当前用的hasMany关联,逻辑是期望Website文档里有一个外键字段(比如user_id)指向User的_id,但你的数据结构正好相反:User文档用website_ids数组存关联的Website ID,而Website文档里没有指向User的外键。这种情况下hasMany完全不匹配你的数据结构,自然查不到结果。
正确解决方案
假设你使用的是jenssegers/laravel-mongodb包(Laravel原生不支持MongoDB),针对这种「用户文档存储关联ID数组」的场景,应该用该包提供的referencesMany关联:
步骤1:确认模型继承正确基类
先确保你的User和Website模型都继承自MongoDB的Eloquent模型:
// App/User.php use Jenssegers\Mongodb\Eloquent\Model; class User extends Model { // ... 其他代码 } // App/Website.php use Jenssegers\Mongodb\Eloquent\Model; class Website extends Model { // ... 其他代码 }
步骤2:修改User模型的关联方法
把原来的hasMany替换为referencesMany,第二个参数传入User文档中存储关联ID的字段名website_ids:
public function websites() { return $this->referencesMany(App\Website::class, 'website_ids'); }
步骤3:测试关联
现在调用$user->websites就能正确获取该用户关联的所有Website文档了。这个关联会自动帮你执行whereIn查询,匹配Website的_id是否在User的website_ids数组中,同时还支持Eloquent的预加载、延迟加载等特性。
备选方案(手动查询)
如果因为包版本问题无法使用referencesMany,你也可以手动定义查询逻辑:
public function websites() { return App\Website::whereIn('_id', $this->website_ids); }
调用时需要加上->get():
$userWebsites = $user->websites()->get();
内容的提问来源于stack exchange,提问作者rameezmeans
相关产品推荐
相关产品推荐

