我想创建一个关系,检查用户是否喜欢帖子。为此,关系需要检查用户是否已登录,然后使用他们的user_id
来获取类似记录。类似的东西:
public function userLike() {
if (Auth::check()) return $this->hasOne('App\Like')->where('user_id', Auth::user()->id);
}
然而,这不起作用。此外,如果用户未登录并且调用此关系(默认情况下),则会返回错误。
这样做的正确方法是什么?
答案 0 :(得分:1)
如果你想有条件地加载关系,那么你可以通过懒惰的预先加载来实现。在您的示例中,您可以将关系定义为
public function userLike() {
return $this->hasOne('App\Like', 'user_id');
}
然后在您的控制器(或其他任何地方),您可以检查用户是否有问题当前是否已登录用户
$loggedInUser = auth()->user();
if($loggedInUser){
$loggedInUser->load('userLike');
}
然后,您可以继续使用loggedInUser
和userLike
完成任何操作。
假设您在一个点(在您的代码中)有多个用户,并且您只想为当前登录的用户加载喜欢的内容,那么您可以
//$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_id
和post_id
(您还可以使用中间件检查用户是否直接在您的路线上登录)
4)在视图中
我会使用ajax调用来调用控制器方法。
不确定我是否忘记了某些内容,但希望这可以帮到你一点点。
如果你需要“喜欢”更多的东西,而不仅仅是发布,请检查多态关系。