列出资源时检查多对多关系

时间:2013-12-11 18:21:44

标签: php laravel laravel-4 eloquent

我在Eloquent中实施关系,我面临以下问题:

article可以包含多个followers(用户),而user可以关注多个articles(按照我的意思,用户会在后续文章中收到通知已更新)。

定义这种关系很容易:

class User extends Eloquent {

    public function followedArticles()
    {
        return $this->belongsToMany('Article', 'article_followers');
    }

}

class Article extends Eloquent {

    public function followers()
    {
        return $this->belongsToMany('User', 'article_followers');
    }

}

现在,在列出文章时,我想展示关于每篇文章的额外信息:如果当前用户是否跟随它。

因此,对于每篇文章我都会:

  • article_id
  • title
  • content
  • etc.
  • is_following(额外字段)

我现在正在做的是:

$articles = Article::with(array(
                'followers' => function($query) use ($userId) {
                    $query->where('article_followers.user_id', '=', $userId);
                }
            )
        );

这样我每篇文章都有一个额外的字段:'粉丝包含一个包含单个用户的数组(如果用户正在关注该文章),或者如果他没有关注它则为空数组。

在我的控制器中,我可以处理这些数据以获得我想要的形式,但我觉得这是一种黑客攻击。

我希望有一个简单的is_following字段和boolean(无论用户是否关注该文章)。

有一种简单的方法吗?

1 个答案:

答案 0 :(得分:0)

这样做的一种方法是为自定义字段创建一个访问者:

class Article extends Eloquent {
    protected $appends = array('is_following');
    public function followers()
    {
        return $this->belongsToMany('User', 'article_followers');
    }
    public function getIsFollowingAttribute() {
        // Insert code here to determine if the 
        // current instance is related to the current user
    }
}

这样做会创建一个名为'is_following'的新字段,该字段将自动添加到返回的json对象或模型中。

确定当前登录用户是否关注该文章的代码取决于您的应用程序。 这样的事情应该有效:

return $this->followers()->contains($user->id);