Php 如何获取帖子列表并检查用户是否已经;“喜欢”;他们?(检查两个模型之间的现有关系)

Php 如何获取帖子列表并检查用户是否已经;“喜欢”;他们?(检查两个模型之间的现有关系),php,mysql,laravel,laravel-4,eloquent,Php,Mysql,Laravel,Laravel 4,Eloquent,我很高兴Laravel framework尝试构建一个小型“博客”网站,其工作方式如下: 当您进入该网页时,将显示最新/最流行帖子的缓存索引 在用户和帖子模型之间有很多关系“user\u likes”,因此,如果您登录,则可以使用“heart”按钮“Like”或“upvote”这些帖子中的每一篇,以便在user\u likes pivot表中创建两个模型之间的关系 我有两个数据库表 用户表: user_id name 1 TheUser 员额表: post_id

我很高兴Laravel framework尝试构建一个小型“博客”网站,其工作方式如下:

  • 当您进入该网页时,将显示最新/最流行帖子的缓存索引
在用户和帖子模型之间有很多关系“user\u likes”,因此,如果您登录,则可以使用“heart”按钮“Like”或“upvote”这些帖子中的每一篇,以便在user\u likes pivot表中创建两个模型之间的关系

我有两个数据库表

用户表:

user_id     name
   1        TheUser
员额表:

post_id     title
   1        MyPost
   2        Another Post
   3        Yet another post
用户_喜欢透视表:

post_id    user_id
  1           1
  3           1
和用户模型类:

class User extends BaseUser {
protected $table = 'users';

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

}
  • 问题是,检索帖子模型列表并检查登录用户是否已经喜欢/支持它们的有效方法是什么
问题是,我想检查每个帖子是否登录用户和帖子模型之间的关系以最有效的方式存在

提前谢谢

编辑:

$posts = Post::get();
$firstPost = $posts->first();
$firstPost->has('likedByUser');
这个SQL FIDLE将是实现我想要做的事情的一种方式,问题是如果我没有错,我将无法缓存帖子,因为每次新用户登录时我都需要检查它们

使用Laravel的查询生成器:

DB::table('posts')
->leftJoin('user_likes', function($join) {
    $join->on('user_likes.post_id', '=', 'posts.id')
        ->where('user_likes.user_id', '=', 1);
})

->select('posts.id as post_id', 'posts.title', 'user_likes as did_i_like')
->groupBy('posts.id')
->orderBy('posts.id');
现在,我在我的应用程序中以不同的方式进行:

我缓存了分页的帖子,然后每个用户都缓存了他们喜欢的帖子ID集合,所以当他们登录时,我会检查每个帖子是否在用户喜欢的帖子集合中:

$liked = Auth::user()->getLikedPosts(); // returns a cached collection of the User liked posts ids
$posts = Post::popular(1); // returns a cached and paginated index of the most popular posts.
然后,我将检查喜欢的集合是否包含post id:

foreach($posts as $post)
{
 .......
 if($liked->contains($post->id)
 {
 // show red Heart
 }
 else
 {
  // show gray heart
 }
 .......
我认为这不是一个好办法,因为$liked系列将会增长很多。。。然而,对于新的查询,我真的不知道如何缓存帖子,这样就不必在用户每次登录或浏览帖子页面时查询数据库

提前谢谢

检索Post模型列表的有效方法是什么 检查登录用户是否已经喜欢/支持他们

在您的
Post
模型中声明关系:

public function likedByUser()
{
    return $this->belongsToMany('User', 'user_likes', 'post_id', 'user_id')
           ->where('user_id', Auth::user()->id);
}
然后检索登录用户喜欢的帖子,如下所示:

$posts = Post::has('likedByUser')->get();
更新:

$posts = Post::get();
$firstPost = $posts->first();
$firstPost->has('likedByUser');
您还可以循环并检查:

$posts = Post::get();
foreach($posts as $post) {
    if($post->has('likedByUser')) {
        // liked it
    }
}

老实说,我不确定这是好是坏,但我是这样做的:

$posts = Post::has('likedByUser')->get();
后模型:

public function likes()
{
    return $this->hasMany('Like');
}

public function likedByUser()
{
    return $this->likes()->where('user_id', Auth::user()->id);
}
与刀片相比:

@if(isset($post->likedByUser[0]))
style="background-position: right;" data-value="liked"
@endif

我对速度不太在意,但我每次都会分页9-12页,所以我希望不会太糟糕:)

如果用户已经喜欢了,那是哪个用户?没有“最好的方式…”之类的东西。执行一项任务有很多不同的方法,但在谈论最佳方法时太主观了。重要的是要记住最佳编程实践。这个问题也很广泛。这就像问。创建tic-tac-toe程序的最佳方式是什么。请缩小范围,也许给som一个你尝试过的例子好吗?问题是,我想得到帖子列表,同时知道登录用户模型是否已经以一种高效的“mysql”方式喜欢这些帖子。你在
Post
model中与
User
有关系方法吗?这是什么?问题是我需要获取所有现有的帖子,不仅仅是Auth用户喜欢的帖子,还需要获取一个属性,告诉用户是否已经喜欢该帖子。我只想在一两个查询中进行检查,而不是在foreach循环中进行检查,foreach循环将逐个检查每个帖子,为每个帖子创建一个查询。感谢您更新的答案@WereWolf,但是,在foreach循环中检查每个帖子将对数据库执行一个新的查询,对吗?因此,如果我有100篇文章,它将生成100个查询,如果有许多登录用户,那么查询的数量将增长很多?提前感谢是的,但您也可以尝试
$posts=Post::with('likedByUser')->get();if($post->first()->getRelation('likedByUser')->count())
;还有
$posts=Post::with('likedByUser')->get();如果(count($posts->first()->likedByUser)){/…}