简化你的关注与点赞 - 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 更名为 CanBeFollowedLaravel 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 协议》,转载必须注明作者和本文链接
厉害了我的佳佳
我觉得 VoterTrait 名字不太对,它应该是 “可以被投票的” 。所以,是不是叫 “Voteable” 会比较好
额。Votable
厉害了,我的健健
@overtrue :satisfied: 修改完毕
@Destiny @茄子
@cjjian Good job!
@cjjian 厉害了
vote能不能加上踩的功能呢?赞和踩在问答类型的帖子中很有用(不仅仅是主题可以赞/踩,回复也应当可以)。
@iVanilla 所以你没看见:$user->downVote($post); 么
@overtrue 抱歉,我只看了正文,没看具体代码 (
@cjjian downVote 不是踩?
@overtrue 木有,那个是取消点赞,踩的功能还没考虑。
@cjjian 额,名称起得有问题啊。。。取消一般是
cancel/remove/unxxxx
@overtrue :ok_hand: ,已改为
cancelVote
.@iVanilla 踩的功能,往后的版本会考虑。:laughing:
@iVanilla 已加上踩的功能。:smile:
有没有数据库结构参考一下
@xuanjiang1985 请看一下源码,有一个迁移文件可参考。
Vote.php
这一段代码的传参没有用上?
@無限之秋 Thx, 已去除多余参数
@cjjian 其实我是想说..传参应该有用才对..不然获取不到想要的数据啊...
@無限之秋 嗯!?你需要传参获取数据?我想问问你的应用场景是?
@cjjian 还是说我应该去覆盖这个?
@無限之秋 是的,你覆盖就行。
@cjjian 没有很复杂的场景
比如我想获取我点赞过的文章,用这个
返回为空...
@無限之秋 说的场景是不是类似这样?
只想获取点赞过的文章,而不是点赞过的评论。
@tima59
也不是,因为vote.php中设置了这个
protected $voteRelation = __CLASS__;
那么我在UserModel里面
use vote.php;
这时候去调用$user->votedItems()->get()实际上查库生成的语句就会变成
这语句一看就知道问题在哪儿了吧.
所以根据@cjjian 之前的回复,我写了一个方法去设置voteRelation
需要查询点赞的文章就这样用
$user->setVoteRelation(Post::class)->votedItems()->get() ;
需要查询点赞的评论就这样用
$user->setVoteRelation(Comment::class)->votedItems()->get();
初学laravel,也不知道这样算不算优雅..
另外请教一下,应该怎么同时查出所有点赞过的内容呢?
刚刚排版炸了...删了重来
@無限之秋 大概了解你的情景,我回头看看怎么处理比较好。
@無限之秋 拉取一下代码,只需
$user->votedItems(Comment::class)->get();
即可@小小特工 报什么错了?
使用过程中
发现错误,应该在 use 过程中添加一层目录 :“\Traits”,
@create_xf 确实发现错误
@create_xf
@minoyu 哈,这个已经改版了,有点变化,建议看看文档。
@cjjian :grin: :grin: 感谢 用上了很好用 发现在投票的时候还要在模型中添加
protected $vote = User::class;
否则会报错我想获取一篇文章的所有评论和点赞是否已点赞该如何操作。。。。 :flushed: @overtrue
想知道怎么解决并发问题?
@cjjian
这个方法能否优化一下,否则每次都需要将所有点赞数查出来,然后用 contains 方法测试是否包含
不考虑下使用缓存吗