我想在我的应用程序中为每个用户实现一种监视列表。监视列表可以包含不同类型的对象,每个对象都是数据库中的模型。
以下是我已经实现的db模式的快速概述。
大部分时间我都需要从该关注列表中仅检索特定项目(如标签或艺术家)。这就是我现在的工作方式:
// controller
$watchedLabels = User::find(4)->labelsWatchlist();
// user model
public function labelsWatchlist()
{
$object_type = WatchlistObject::where('name', '=', 'label')->first();
if ($watchlistObject) {
return DB::table('users_watchlists')
->join('artists', 'users_watchlists.object_id', '=', 'artists.id')
->where('users_watchlists.user_id', '=', $this->id)
->where('users_watchlists.object_type_id', '=', $object_type->id)
->get();
}
}
正如我所说,这完全有效...但由于某种原因我无法解释,我真的不喜欢这种实现,发现它有点蹩脚。我希望能够得到相同的结果,让我们说“更流畅”的方式,比如$ user-> watchlist->标签。但目前的设置并不是真的可以......
有什么建议吗?!
答案 0 :(得分:1)
这是polymorphic many-to-many relationship:
// User model
// assuming Artist model is observable
public function artists()
{
return $this->morphedByMany('Artist', 'object', 'users_watchlists');
}
// assuming Label model is observable as well
public function labels()
{
return $this->morphedByMany('Label', 'object', 'users_watchlists');
}
// Artist model (teh same goes for any other observable model)
// assuming Artist model is observable
public function observers() // or users whatever suits you
{
return $this->morphedToMany('User', 'object', 'users_watchlists');
}
然后简单地致电:
$user->labels; // collection of observed labels
$user->artists; // collection like above
$artist->observers; // collection of observing users
答案 1 :(得分:-2)