【发布时间】:2016-07-26 07:57:07
【问题描述】:
我正在尝试使用 Laravel/Jenssegers MongoDB 为我的应用设置一些简单的收藏夹
我有两个模型:
class Item {
public function favorites()
{
return $this->hasMany('App\Models\User', 'favorites');
}
}
class User {
public function favorites()
{
return $this->hasMany('App\Models\Item', 'favorites');
}
}
所以一个项目可以有很多用户,而一个用户可以有很多项目或“收藏夹”。
当我尝试运行一个简单的查询时:
Item::with('favorites')->get();
收藏夹的关系存在但一个空数组。
favorites 表很简单,只有三列:
_id, item_id, user_id
我也尝试过使用embedsMany,但没有成功:
return $this->embedsMany('App\Models\User', 'favorites');
我也尝试了各种参数组合。
return $this->embedsMany('App\Models\User', 'favorites', 'building_id', 'user_id');
return $this->embedsMany('App\Models\User', 'favorites', 'user_id', 'building_id');
return $this->hasMany('App\Models\User', 'favorites', 'building_id', 'user_id');
return $this->hasMany('App\Models\User', 'favorites', 'user_id', 'building_id');
使用时的奇怪结果:
return $this->hasMany('App\Models\User', 'favorites', 'building_id', 'user_id');
只有在这种情况下,它才会返回所有用户,即使收藏夹只有一条记录。
同时尝试使用getQueryLog 进行调试只会给我一个空数组。
print_r(\DB::connection('mongodb')->getQueryLog());
我已经使用mysql 完成了此操作,并且从未遇到过问题。所以不太确定问题出在哪里。
【问题讨论】:
-
您必须记住,像 MongoDB 这样的 NoSQL 数据库不应该有关系。这就是 NoSQL 数据库的想法。如果您需要传统的关系,也许您应该考虑使用传统的 SQL 数据库(如 MySQL 或 PostgreSQL)。
-
确切地说,如果你想要 hasMany 关系,你必须将整个用户实例嵌套在 Item 对象中,例如
{ "users": [ {"name": "user1"}, {"name": "user2"} ] } -
@Bald 我猜 eloquent 没有连接,它使用急切加载。那么获取一些相关数据有什么问题。例如,您不会将用户对象存储在帖子的评论中,对吧?
-
@Rob 如果查询日志为空,您可能忘记启用日志记录。在尝试检索日志本身之前,您是否尝试调用
enableQueryLog()? -
我并没有真正使用 MongoDb,但这似乎是标准关系 Eloquent 中的
hasManyThrough!
标签: laravel laravel-5 jenssegers-mongodb