与用户条件的关系

时间:2016-10-01 23:09:43

标签: laravel laravel-5 laravel-5.3

我有一个像Twitter一样的跟随系统(跟随其他人并从中获取更新)。

我在User.php模型中设置了此关系:

public function follows()
{
    return $this->hasMany('App\Follow');
}

这显然会记录关注此人的所有用户记录。

但是,在显示此人的个人资料页面时,我想获得一个关系,该关系会根据用户ID检查是否存在关注记录。

类似的东西:

public function userFollow()
{
    return $this->hasOne('App\Follow')->where('user_id', Auth::user()->id);
}

所以现在我的个人资料页面查询如下所示:

$user = User::where('username', $username)
    ->with('userFollow')
    ->first();

只要用户已登录,此功能就可以使用。如果用户没有登录,则该页面会显示以下错误:

  

User.php第28行中的ErrorException:尝试获取属性   非对象

我该如何解决这个问题?在关系中使用条件的正确方法是什么?

2 个答案:

答案 0 :(得分:0)

这是因为如果用户注销,则Auth :: user()为null,因为用户会话已结束。 Auth :: user()不再是对象,因此您无法从null对象获取id。

在这里你可以做那样的事情

public function userFollow()
{
  $userId = Auth::user() ? Auth::user()->id : $this->id; 
  return $this->hasOne('App\Follow')->where('user_id', $userId);
}

然后它不会查找经过身份验证的用户,它只会获取特定用户表的ID。

答案 1 :(得分:0)

在关系中使用条件的正确方法是使用Constraining eager loads

public function userFollow()
{
    return $this->hasOne('App\Follow');
}

if(Auth::check())
{
       $user = User::where('username', $username)
             ->with(['userFollow'=>function($query)
                {
                    $query->where('user_id', Auth::user()->id);
                }]);
             ->first();
}