简化你的关注与点赞 - Laravel Follow & Vote

Laravel Follow & Vote

本文主要介绍两个包:

Laravel - Follow : https://github.com/overtrue/laravel-follow

Laravel - Vote : https://github.com/jcc/laravel-vote

你会疑惑这两个包有什么用的呢?当然如标题所说,简化你关注和点赞功能,Laravel - Follow 用于关注功能,Laravel - Vote 用于点赞功能。

如果你看了代码,你会发现两个包的代码基本上是一致的,当要注意,两个包的应用场景是不一样的。

Laravel - Follow 之前的版本只支持用户关注,当然最近也做了一些改造工作,实现了多种情景下的应用,如:专栏关注、用户关注等情景。

当然,Laravel - Vote 也支持多种情景的应用,如:文章点赞、评论回复点赞等。废话不多说,下面我简单介绍一下两个包的用法吧。

安装

Laravel Follow

使用 composer 安装包:

composer require overtrue/laravel-follow -vvv

添加服务提供者到 config/app.php 下:

Overtrue\LaravelFollow\FollowServiceProvider::class

发布迁移文件:

php artisan vendor:publish --provider="Overtrue\LaravelFollow\FollowServiceProvider" --tag="migrations"

Laravel Vote

使用 composer 安装包:

composer require jcc/laravel-vote -vvv

添加服务提供者到 config/app.php 下:

Jcc\LaravelVote\VoteServiceProvider::class

发布迁移文件:

php artisan vendor:publish --provider="Jcc\LaravelVote\VoteServiceProvider" --tag="migrations"

用法

当然用法也是非常的简单,你无需顾虑它们间的关联关系。

Laravel Follow

应用场景:用户关注用户

首先,在 User 模型中引入 CanFollow 以及 CanBeFollowed

use Overtrue\LaravelFollow\CanFollow;
use Overtrue\LaravelFollow\CanBeFollowed;

class User extends Model
{
    use CanFollow, CanBeFollowed;
}

关注用户:

$user->follow(1);

// or

$user->follow([1,2,3,4]);

// or

$target = User::find(2);

$user->follow($target);

取消关注用户:

$user->unfollow(1);

// or

$user->unfollow([1,2,3,4]);

// or

$target = User::find(2);

$user->unfollow($target);

获取用户的关注者:

$user->followers();

获取用户关注的用户:

$user->followings();

判断用户是否关注了:

$user->isFollowing(1);

// or

$target = User::find(1);

$user->isFollowing($target);

判断用户是否被关注了:

$user->isFollowedBy(1);

Laravel Vote

应用场景:用户点赞文章

只需在 User 模型中引入 Vote ,在 Post 模型引入 CanBeVoted

User.php

use Jcc\LaravelVote\Vote;

class User extends Model
{
    use Vote;
}

Post.php

use Jcc\LaravelVote\CanBeVoted;

class Post extends Model
{
    use CanBeVoted;
}

针对 User.php 的操作

用户点赞文章:

$post = Post::find(1);

$user->upVote($post);

用户取消点赞文章:

$post = Post::find(1);

$user->cancelVote($post);

获取用户已点赞的记录:

$user->votedItems();

判断是否已点赞:

$post = Post::find(1);

$user->hasVoted($post);

针对文章的操作

获取所有点赞的用户:

$post->voters();

判断用户是否有点赞:

$post->isVotedBy(1);

至此,你可以愉快使用这两个包,当然,你需要按照你所需的应用场景使用,而不是乱用(Follow 当成 Vote 使用等)。还有的是这里使用了 Trait如何去理解以及更好地使用 Trait — By Overtrue

最后,当然是要感谢超哥 overtrue

经讨论
Laravel Follow
FollowTrait 更名为 CanFollow
FollowerTrait 更名为 CanBeFollowed

Laravel Vote
VoteTrait 更名为 Vote
VoterTrait 更名为 CanBeVoted

二次讨论
首先感谢 @iVanilla。

Laravel Vote 中的 Vote 是投票、表决的意思,那么投票、表决,有赞同当然也有反对。

So Laravel Vote v1.1.0 做了如下的改变,让此包定位更明确:

  • 增加一个字段 type(区分赞同、反对类型)
  • 增加如下方法:
    • downVote() —— 投反对票
    • hasUpVoted() —— 判断是否有赞同票
    • hasDownVoted() —— 判断是否有反对票
    • countUpVoters() —— 计算赞同票数
    • countDownVoters() —— 计算反对票数
    • countVoters() —— 计算所有票数

详细用法请看 Laravel-vote 的 README.md

本作品采用《CC 协议》,转载必须注明作者和本文链接
Nothing is impossible. —— @Jiajian Chan
本帖由 Summer 于 7年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 39
Destiny

厉害了我的佳佳

7年前 评论

我觉得 VoterTrait 名字不太对,它应该是 “可以被投票的” 。所以,是不是叫 “Voteable” 会比较好

7年前 评论

额。Votable

7年前 评论

厉害了,我的健健

7年前 评论

vote能不能加上踩的功能呢?赞和踩在问答类型的帖子中很有用(不仅仅是主题可以赞/踩,回复也应当可以)。

7年前 评论

@iVanilla 所以你没看见:$user->downVote($post); 么

7年前 评论

@overtrue 抱歉,我只看了正文,没看具体代码 (

7年前 评论

@cjjian downVote 不是踩?

7年前 评论

@overtrue 木有,那个是取消点赞,踩的功能还没考虑。

7年前 评论

@cjjian 额,名称起得有问题啊。。。取消一般是 cancel/remove/unxxxx

7年前 评论

@overtrue :ok_hand: ,已改为 cancelVote.

7年前 评论

@iVanilla 踩的功能,往后的版本会考虑。:laughing:

7年前 评论

@iVanilla 已加上踩的功能。:smile:

7年前 评论

有没有数据库结构参考一下

6年前 评论

@xuanjiang1985 请看一下源码,有一个迁移文件可参考。

6年前 评论

Vote.php

public function votedItems($class = __CLASS__)
{
    return $this->morphedByMany($this->voteRelation, 'votable', 'votes')->withTimestamps();
}

这一段代码的传参没有用上?

6年前 评论

@cjjian 其实我是想说..传参应该有用才对..不然获取不到想要的数据啊...

6年前 评论

@無限之秋 嗯!?你需要传参获取数据?我想问问你的应用场景是?

6年前 评论

@cjjian 还是说我应该去覆盖这个?

protected $voteRelation = __CLASS__;
6年前 评论

@cjjian 没有很复杂的场景
比如我想获取我点赞过的文章,用这个

$user->votedItems()->get()

返回为空...

6年前 评论

@無限之秋 说的场景是不是类似这样?

只想获取点赞过的文章,而不是点赞过的评论。

6年前 评论

@tima59
也不是,因为vote.php中设置了这个protected $voteRelation = __CLASS__;

那么我在UserModel里面use vote.php;

这时候去调用$user->votedItems()->get()实际上查库生成的语句就会变成

select count(*) as aggregate from `users` inner join `votes` on `users`.`id` = `votes`.`votable_id` 
where `votes`.`user_id` = 1 and `votes`.`votable_type` = 'App\\Models\\User';

这语句一看就知道问题在哪儿了吧.
所以根据@cjjian 之前的回复,我写了一个方法去设置voteRelation

public function setVoteRelation($class = null)
{
$class && $this->voteRelation = $class;
return $this;
} 

需要查询点赞的文章就这样用$user->setVoteRelation(Post::class)->votedItems()->get() ;

需要查询点赞的评论就这样用$user->setVoteRelation(Comment::class)->votedItems()->get();

初学laravel,也不知道这样算不算优雅..

另外请教一下,应该怎么同时查出所有点赞过的内容呢?

刚刚排版炸了...删了重来

6年前 评论

@無限之秋 大概了解你的情景,我回头看看怎么处理比较好。

6年前 评论

@無限之秋 拉取一下代码,只需 $user->votedItems(Comment::class)->get(); 即可

6年前 评论
create_xf

使用过程中

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Overtrue\LaravelFollow\CanFollow;
use Overtrue\LaravelFollow\CanBeFollowed;

class User extends Authenticatable
{
use Notifiable, CanFollow, CanBeFollowed;
}

发现错误,应该在 use 过程中添加一层目录 :“\Traits”,

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Overtrue\LaravelFollow\Traits\CanFollow;
use Overtrue\LaravelFollow\Traits\CanBeFollowed;

class User extends Authenticatable
{
    use Notifiable, CanFollow, CanBeFollowed;
}
6年前 评论
minoyu

@create_xf 确实发现错误

5年前 评论

@create_xf
@minoyu 哈,这个已经改版了,有点变化,建议看看文档。

5年前 评论
minoyu

@cjjian :grin: :grin: 感谢 用上了很好用 发现在投票的时候还要在模型中添加protected $vote = User::class;否则会报错

5年前 评论
GalaxyNo_1

我想获取一篇文章的所有评论和点赞是否已点赞该如何操作。。。。 :flushed: @overtrue

5年前 评论

想知道怎么解决并发问题?

5年前 评论
  public function isVotedBy($user)
  {
        return $this->voters->contains($user);
   }

@cjjian

这个方法能否优化一下,否则每次都需要将所有点赞数查出来,然后用 contains 方法测试是否包含

5年前 评论

不考虑下使用缓存吗

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!