我有3张桌子:
users
表posts
表(用户可以有很多帖子)likes
表(与Facebook喜欢的方式相同)我有以下关系:
user.php的:
public function posts()
{
return $this->hasMany('App\Post');
}
post.php中:
public function user()
{
return $this->belongsTo('App\User');
}
public function likes()
{
return $this->hasMany('App\Like');
}
Like.php :
public function post()
{
return $this->belongsTo('App\Post');
}
要获得所有帖子,我会这样做:
$posts = Post::with('likes')
->get();
但是,这会返回与帖子关联的所有相似内容(我不想要)。我需要做的是检查登录用户是否喜欢每个帖子。
例如,在我看来,我有:
@foreach ($posts as $post)
// check if logged in user liked the $post
@endforeach
如何修改我的代码,以便我可以检查用户是否喜欢每个帖子,如何通过简单地添加新关系来执行此操作?
答案 0 :(得分:0)
首先,您需要在用户和喜欢之间建立关系
用户模型
public function likes() {
return $this->hasMany('App\Like');
}
赞模特
public function user() {
return $this->belongsTo('App\User');
}
发布模型
public function isLiked() {
return (bool) $this->likes()->where('user_id', Auth::user()->id)->first();
// Will return true if liked by the logged in user
}
现在你可以像这样使用它:
if ( $post->isLiked() ) {
// Do something
}
答案 1 :(得分:0)
我非常确定你在Post with Likes和Post with User models之间建立了关系
所以...在Post模型中创建公共函数,我认为你有像 post_id 和 user_id 这样的字段来保留喜欢的内容。
发布模型:
public function likes()
{
return $this->belongsTo('App\Like', 'post_id);
}
之后在你的控制器中进行查询以获取帖子
后置控制器
$post = Post::all();
并在模板中,您可以检查user_id是否在此帖子中
发布视图
foreach($post as $p) {
if($logged_user_id === $p->like()->user_id) {
echo 'liked';
} else {
echo 'not liked';
}
}
答案 2 :(得分:0)
我认为这会对你有帮助,(步骤1)
$post = Post::with(['Like.User' => function ($query) {
$query->where('users.id', '=', Auth::user()->id);
}])->get();
注意: - 用户是表名。 它将为所有帖子和所有喜欢的用户登录。
另一个解决方案,它将返回与用户特定喜欢(喜欢由auth用户)的所有帖子。 (步骤2)
foreach ($post as $item) {
$like = $item->Like;
foreach ($like as $key => $user){
if(count($user->User) == 0){
unset($like[$key]);
}
}
}
结果将针对第1步: -
[
{
"post" : "details",
"like" : [ {
"post_id" : 1,
"user_id" : 1 },
{
"post_id" : 1,
"user_id" : null }],
{
"post" : "details",
"like" : [] }
]
结果将是第2步: -
[
{
"post" : "details",
"like" : [ {
"post_id" : 1,
"user_id" : 1 }],
{
"post" : "details",
"like" : [] }
]
结果关键字是假设,期望是post和user表中的user_id,post_id在like表中。