用户登录时的关系条件

时间:2016-12-06 23:13:39

标签: php laravel laravel-5 eloquent laravel-5.3

我想创建一个关系,检查用户是否喜欢帖子。为此,关系需要检查用户是否已登录,然后使用他们的user_id来获取类似记录。类似的东西:

public function userLike() {
    if (Auth::check()) return $this->hasOne('App\Like')->where('user_id', Auth::user()->id);
}

然而,这不起作用。此外,如果用户未登录并且调用此关系(默认情况下),则会返回错误。

这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

如果你想有条件地加载关系,那么你可以通过懒惰的预先加载来实现。在您的示例中,您可以将关系定义为

public function userLike() {
    return $this->hasOne('App\Like', 'user_id');
}  

然后在您的控制器(或其他任何地方),您可以检查用户是否有问题当前是否已登录用户

$loggedInUser = auth()->user(); 
if($loggedInUser){
    $loggedInUser->load('userLike');
}  

然后,您可以继续使用loggedInUseruserLike完成任何操作。

假设您在一个点(在您的代码中)有多个用户,并且您只想为当前登录的用户加载喜欢的内容,那么您可以

//$users is a collection of multiple users - assumed
foreach($users as $user){
    if($user->email === auth()->user()->email){
        $user->load('userLike');
    }
}  

希望这有帮助

答案 1 :(得分:0)

我就是这样做的:

1)“喜欢”表格

我首先要创建一个表来存储所有“赞”,其中包含“post_id”和“user_id”的列

2)创建关系

用户模型

public function likes()
{
    return $this->belongsToMany('App\Post', 'likes', 'user_id', 'post_id');
}

发布模型

public function likes()
{
    return $this->belongsToMany('App\User', 'likes');
}

3)后置控制器 - 方法

我会做以下事情:

  • 检查用户是否已登录,否则抛出错误
  • 确保帖子存在,否则抛出错误
  • 使用user_idpost_id
  • 在相似的表格中创建新条目

(您还可以使用中间件检查用户是否直接在您的路线上登录)

4)在视图中

我会使用ajax调用来调用控制器方法。

不确定我是否忘记了某些内容,但希望这可以帮到你一点点。

如果你需要“喜欢”更多的东西,而不仅仅是发布,请检查多态关系。