我有一个像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:尝试获取属性 非对象
我该如何解决这个问题?在关系中使用条件的正确方法是什么?
答案 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();
}