使用Laravel和Eloquent进行用户观察列表设计改进

时间:2014-09-30 18:46:10

标签: database-design laravel eloquent

我想在我的应用程序中为每个用户实现一种监视列表。监视列表可以包含不同类型的对象,每个对象都是数据库中的模型。

以下是我已经实现的db模式的快速概述。

enter image description here

大部分时间我都需要从该关注列表中仅检索特定项目(如标签或艺术家)。这就是我现在的工作方式:

 // 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->标签。但目前的设置并不是真的可以......

有什么建议吗?!

2 个答案:

答案 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)