liliom / laravel-acquaintances
此轻量级包无依赖,为Eloquent模型提供了管理友情(及群组)的能力。包括以下交互功能:点赞、收藏、投票、订阅、关注等。还包含高级评分系统。
Requires
- php: >=8.0
Requires (Dev)
- codeclimate/php-test-reporter: ^0.3.2
- doctrine/dbal: ^2.5
- fzaninotto/faker: ~1.4
- laravel/laravel: 5.*|^9.0|^10.0|^11.0
- mockery/mockery: 1.0.x-dev
- phpunit/phpunit: 5.*
This package is auto-updated.
Last update: 2024-06-08 13:48:44 UTC
README
支持Laravel 10及以下版本,无依赖
TL;DR
为Eloquent模型提供功能
- 友情与群组功能
- 如点赞等交互功能
- 点赞
- 收藏
- 投票(赞同/反对)
- 订阅
- 关注
- 评分
- 查看
参考以下示例
$user1 = User::find(1); $user2 = User::find(2); $user1->befriend($user2); $user2->acceptFriendRequest($user1); // The messy breakup :( $user2->unfriend($user1);
简介
此轻量级包为Eloquent模型提供了管理熟人关系和其他酷炫实用功能。您可以轻松设计类似社交平台(Facebook、Twitter、Foursquare等)的系统。
熟人关系包包括
- 发送好友请求
- 接受好友请求
- 拒绝好友请求
- 屏蔽用户
- 分组朋友
- 评分用户或模型,支持多个方面
- 关注用户或模型
- 点赞用户或模型
- 订阅用户或模型
- 收藏用户或模型
- 投票(赞同/反对用户或模型)
- 查看用户或模型
安装
首先,通过Composer安装此包。
composer require multicaret/laravel-acquaintances
Laravel 5.8及以上版本 => 版本 2.x(master分支)
Laravel 5.7及以下版本 => 版本 1.x(v1分支)
发布配置和迁移文件
php artisan vendor:publish --provider="Multicaret\Acquaintances\AcquaintancesServiceProvider"
在以下位置配置发布的配置
config/acquaintances.php
最后,迁移数据库以创建表
php artisan migrate
设置模型
示例
use Multicaret\Acquaintances\Traits\Friendable; use Multicaret\Acquaintances\Traits\CanFollow; use Multicaret\Acquaintances\Traits\CanBeFollowed; use Multicaret\Acquaintances\Traits\CanLike; use Multicaret\Acquaintances\Traits\CanBeLiked; use Multicaret\Acquaintances\Traits\CanRate; use Multicaret\Acquaintances\Traits\CanBeRated; //... class User extends Model { use Friendable; use CanFollow, CanBeFollowed; use CanLike, CanBeLiked; use CanRate, CanBeRated; //... }
以下列出了所有可用的Friendships & Interactions API。
友情
好友请求
将Friendable
特性添加到User模型中。
use Multicaret\Acquaintances\Traits\Friendable; class User extends Model { use Friendable; }
发送好友请求
$user->befriend($recipient);
接受好友请求
$user->acceptFriendRequest($sender);
拒绝好友请求
$user->denyFriendRequest($sender);
移除好友
$user->unfriend($friend);
屏蔽模型
$user->blockFriend($friend);
解除屏蔽
$user->unblockFriend($friend);
检查模型是否为另一个模型的好友
$user->isFriendWith($friend);
检查好友请求
检查模型是否收到另一个模型的待处理好友请求
$user->hasFriendRequestFrom($sender);
检查模型是否已向另一个模型发送好友请求
$user->hasSentFriendRequestTo($recipient);
检查模型是否屏蔽了另一个模型
$user->hasBlocked($friend);
检查模型是否被另一个模型屏蔽
$user->isBlockedBy($friend);
获取好友请求
获取单个友情关系
$user->getFriendship($friend);
获取所有友情关系列表
$user->getAllFriendships(); $user->getAllFriendships($group_name, $perPage = 20, $fields = ['id','name']);
获取待处理友情关系列表
$user->getPendingFriendships(); $user->getPendingFriendships($group_name, $perPage = 20, $fields = ['id','name']);
获取已接受友情关系列表
$user->getAcceptedFriendships(); $user->getAcceptedFriendships($group_name, $perPage = 20, $fields = ['id','name']);
获取已拒绝友情关系列表
$user->getDeniedFriendships(); $user->getDeniedFriendships($perPage = 20, $fields = ['id','name']);
获取总屏蔽友情关系列表
$user->getBlockedFriendships(); $user->getBlockedFriendships($perPage = 20, $fields = ['id','name']);
获取当前用户屏蔽的友情关系列表
$user->getBlockedFriendshipsByCurrentUser(); $user->getBlockedFriendshipsByCurrentUser($perPage = 20, $fields = ['id','name']);
获取其他用户屏蔽的友情关系列表
$user->getBlockedFriendshipsByOtherUsers(); $user->getBlockedFriendshipsByOtherUsers($perPage = 20, $fields = ['id','name']);
获取待处理好友请求列表
$user->getFriendRequests();
获取朋友数量
$user->getFriendsCount();
获取待处理请求数量
$user->getPendingsCount();
获取与另一个用户的共同朋友数量
$user->getMutualFriendsCount($otherUser);
获取朋友列表
要获取朋友模型集合(例如User),请使用以下方法
getFriends()
$user->getFriends(); // or paginated $user->getFriends($perPage = 20, $group_name); // or paginated with certain fields $user->getFriends($perPage = 20, $group_name, $fields = ['id','name']); // or paginated with cursor & certain fields $user->getFriends($perPage = 20, $group_name, $fields = ['id','name'], $cursor = true);
参数
$perPage
: 整数(默认:0
),获取分页值$group_name
: 字符串(默认:''
),获取特定群组的分页好友集合$fields
: 数组(默认:['*']
),指定要查询的字段。
getFriendsOfFriends()
$user->getFriendsOfFriends(); // or $user->getFriendsOfFriends($perPage = 20); // or $user->getFriendsOfFriends($perPage = 20, $fields = ['id','name']);
参数
$perPage
: 整数(默认:0
),获取分页值$fields
: 数组(默认:['*']
),指定要查询的字段。
getMutualFriends()
获取与另一用户的共同好友
$user->getMutualFriends($otherUser); // or $user->getMutualFriends($otherUser, $perPage = 20); // or $user->getMutualFriends($otherUser, $perPage = 20, $fields = ['id','name']);
参数
$other
: 模型(必需),检查共同好友的其他用户模型$perPage
: 整数(默认:0
),获取分页值$fields
: 数组(默认:['*']
),指定要查询的字段。
朋友群组
好友组在config/acquaintances.php
文件中定义。该包包含一些默认组。要修改它们或添加自己的组,您需要指定一个slug
和一个key
。
// config/acquaintances.php //... 'groups' => [ 'acquaintances' => 0, 'close_friends' => 1, 'family' => 2 ];
由于您已配置好友组,您可以使用以下方法分组/取消分组好友。
分组一个好友
$user->groupFriend($friend, $group_name);
从家族组中删除一个好友
$user->ungroupFriend($friend, 'family');
从所有组中删除一个好友
$user->ungroupFriend($friend);
获取特定组中好友的数量
$user->getFriendsCount($group_name);
要按组过滤friendships
,您可以传递一个组slug。
$user->getAllFriendships($group_name); $user->getAcceptedFriendships($group_name); $user->getPendingFriendships($group_name); ...
交互
特性使用
向用户模型添加CanXXX
特性。
use Multicaret\Acquaintances\Traits\CanFollow; use Multicaret\Acquaintances\Traits\CanLike; use Multicaret\Acquaintances\Traits\CanFavorite; use Multicaret\Acquaintances\Traits\CanSubscribe; use Multicaret\Acquaintances\Traits\CanVote; class User extends Model { use CanFollow, CanLike, CanFavorite, CanSubscribe, CanVote; }
向目标模型添加CanBeXXX
特性,例如'Post'或'Book'...
use Multicaret\Acquaintances\Traits\CanBeLiked; use Multicaret\Acquaintances\Traits\CanBeFavorited; use Multicaret\Acquaintances\Traits\CanBeVoted; use Multicaret\Acquaintances\Traits\CanBeRated; class Post extends Model { use CanBeLiked, CanBeFavorited, CanBeVoted, CanBeRated; }
以下列出了所有可用的API。
关注
\Multicaret\Acquaintances\Traits\CanFollow
$user->follow($targets); $user->unfollow($targets); $user->toggleFollow($targets); $user->followings()->get(); // App\User:class $user->followings(App\Post::class)->get(); $user->isFollowing($target);
\Multicaret\Acquaintances\Traits\CanBeFollowed
$object->followers()->get(); $object->isFollowedBy($user); $object->followersCount(); // or as attribute $object->followers_count $object->followersCountReadable(); // return readable number with precision, i.e: 5.2K
评分
\Multicaret\Acquaintances\Traits\CanRate
// Rate type in the following line will be // the same as the one specified // in config('acquaintances.rating.defaults.type') // if your app is using a single type of rating on your model, // like one factor only, then simply use the rate() as it's shown here, // and if you have multiple factors then // take a look the examples exactly below this these ones. $user->rate($targets); $user->unrate($targets); $user->toggleRate($targets); $user->ratings()->get(); // App\User:class $user->ratings(App\Post::class)->get(); $user->hasRated($target); // Some Examples on how to rate the object based on different factors (rating type) $user->setRateType('bedside-manners')->rate($target, 4); $user->setRateType('waiting-time')->rate($target, 3); $user->setRateType('quality')->rate($target, 4); $user->setRateType('delivery-time')->rate($target, 2); $user->setRateType('communication')->rate($target, 5); // Remember that you can always use the functions on $target which have this phrase "AllTypes" in them. check the below section for more details
\Multicaret\Acquaintances\Traits\CanBeRated
$object->raters()->get(); $object->isRatedBy($user); $object->averageRating(); // or as attribute $object->average_rating $object->averageRatingAllTypes(); // or as attribute $object->average_rating_all_types $object->sumRating(); // or as attribute $object->sum_rating $object->sumRatingAllTypes(); // or as attribute $object->sum_rating_all_types_all_types $object->sumRatingReadable(); // return readable number with precision, i.e: 5.2K $object->sumRatingAllTypesReadable(); // return readable number with precision, i.e: 5.2K $object->ratingPercent($max = 5); // calculating the percentage based on the passed coefficient $object->ratingPercentAllTypes($max = 5); // calculating the percentage based on the passed coefficient // User Related: $object->userAverageRatingAllTypes(); // or as attribute $object->user_average_rating_all_types $object->userSumRatingAllTypes(); // or as attribute $object->user_sum_rating_all_types $object->userSumRatingReadable(); // return readable number with precision, i.e: 5.2K $object->userSumRatingAllTypesReadable(); // return readable number with precision, i.e: 5.2K
点赞
\Multicaret\Acquaintances\Traits\CanLike
$user->like($targets); $user->unlike($targets); $user->toggleLike($targets); $user->hasLiked($target); $user->likes()->get(); // default object: App\User:class $user->likes(App\Post::class)->get();
\Multicaret\Acquaintances\Traits\CanBeLiked
$object->likers()->get(); $object->fans()->get(); // or $object->fans. it's an alias of likers() $object->isLikedBy($user); $object->likersCount(); // or as attribute $object->likers_count $object->likersCountReadable(); // return readable number with precision, i.e: 5.2K
收藏
\Multicaret\Acquaintances\Traits\CanFavorite
$user->favorite($targets); $user->unfavorite($targets); $user->toggleFavorite($targets); $user->hasFavorited($target); $user->favorites()->get(); // App\User:class $user->favorites(App\Post::class)->get();
\Multicaret\Acquaintances\Traits\CanBeFavorited
$object->favoriters()->get(); // or $object->favoriters $object->isFavoritedBy($user); $object->favoritersCount(); // or as attribute $object->favoriters_count $object->favoritersCountReadable(); // return readable number with precision, i.e: 5.2K
订阅
\Multicaret\Acquaintances\Traits\CanSubscribe
$user->subscribe($targets); $user->unsubscribe($targets); $user->toggleSubscribe($targets); $user->hasSubscribed($target); $user->subscriptions()->get(); // default object: App\User:class $user->subscriptions(App\Post::class)->get();
Multicaret\Acquaintances\Traits\CanBeSubscribed
$object->subscribers(); // or $object->subscribers $object->isSubscribedBy($user); $object->subscribersCount(); // or as attribute $object->subscribers_count $object->subscribersCountReadable(); // return readable number with precision, i.e: 5.2K
投票
\Multicaret\Acquaintances\Traits\CanVote
$user->vote($target); // Vote with 'upvote' for default $user->upvote($target); $user->downvote($target); $user->cancelVote($target); $user->hasUpvoted($target); $user->hasDownvoted($target); $user->votes(App\Post::class)->get(); $user->upvotes(App\Post::class)->get(); $user->downvotes(App\Post::class)->get();
\Multicaret\Acquaintances\Traits\CanBeVoted
$object->voters()->get(); $object->isVotedBy($user); $object->votersCount(); // or as attribute $object->voters_count $object->votersCountReadable(); // return readable number with precision, i.e: 5.2K $object->upvoters()->get(); $object->isUpvotedBy($user); $object->upvotersCount(); // or as attribute $object->upvoters_count $object->upvotersCountReadable(); // return readable number with precision, i.e: 5.2K $object->downvoters()->get(); $object->isDownvotedBy($user); $object->downvotersCount(); // or as attribute $object->downvoters_count $object->downvotersCountReadable(); // return readable number with precision, i.e: 5.2K
查看
\Multicaret\Acquaintances\Traits\CanView
$user->view($targets); $user->unview($targets); $user->toggleView($targets); $user->hasViewed($target); $user->viewers()->get(); // default object: App\User:class $user->viewers(App\Post::class)->get();
\Multicaret\Acquaintances\Traits\CanBeViewed
$object->viewers()->get(); $object->isViewedBy($user); $object->viewersCount(); // or as attribute $object->viewers_count $object->viewersCountReadable(); // return readable number with precision, i.e: 5.2K
参数
上述创建关系的方法,如'follow'、'like'、'unfollow'、'unlike',它们的语法如下
follow(array|int|\Illuminate\Database\Eloquent\Model $targets, $class = __CLASS__)
所以您可以这样调用它们
// id / int|array $user->follow(1); // targets: 1, $class = App\User $user->follow(1, App\Post::class); // targets: 1, $class = App\Post $user->follow([1, 2, 3]); // targets: [1, 2, 3], $class = App\User // Model $post = App\Post::find(7); $user->follow($post); // targets: $post->id, $class = App\Post // Model array $posts = App\Post::popular()->get(); $user->follow($posts); // targets: [1, 2, ...], $class = App\Post
查询关系
$followers = $user->followers; $followers = $user->followers()->where('id', '>', 10)->get(); $followers = $user->followers()->orderByDesc('id')->get(); $followers = $user->followers()->paginate(10);
您可以使用相同的方式使用其他特性。
与模型协同工作
use Multicaret\Acquaintances\Models\InteractionRelation; // Get most popular object // 1- All types $relations = InteractionRelation::popular()->get(); // 2- subject_type = App\Post $relations = InteractionRelation::popular(App\Post::class)->get(); // 3- subject_type = App\User $relations = InteractionRelation::popular('user')->get(); // 4- subject_type = App\Post $relations = InteractionRelation::popular('post')->get(); // 5- Pagination $relations = InteractionRelation::popular(App\Post::class)->paginate(15);
事件
以下是每个动作默认触发的事件的列表
事件名称 | 触发 |
---|---|
acq.friendships.sent | 当发送好友请求时 |
acq.friendships.accepted | 当接受好友请求时 |
acq.friendships.denied | 当拒绝好友请求时 |
acq.friendships.blocked | 当阻止好友时 |
acq.friendships.unblocked | 当取消阻止好友时 |
acq.friendships.cancelled | 当取消友谊时 |
acq.ratings.rate | 当一个或多个项目被评分时 |
acq.ratings.unrate | 当一个或多个项目取消评分时 |
acq.vote.up | 当一个或多个项目被点赞时 |
acq.vote.down | 当一个或多个项目被踩时 |
acq.vote.cancel | 当一个或多个项目取消投票时 |
acq.likes.like | 当一个或多个项目被点赞时 |
acq.likes.unlike | 当一个或多个项目取消点赞时 |
acq.followships.follow | 当一个或多个项目被关注时 |
acq.followships.unfollow | 当一个或多个项目被取消关注时 |
acq.favorites.favorite | 当一个或多个项目被收藏时 |
acq.favorites.unfavorite | 当一个或多个项目取消收藏时 |
acq.subscriptions.subscribe | 当一个或多个项目被订阅时 |
acq.subscriptions.unsubscribe | 当一个或多个项目取消订阅时 |
acq.views.view | 当一个或多个项目被查看时 |
acq.views.unview | 当一个或多个项目取消查看时 |
贡献
查看CONTRIBUTING指南。
此库的初始版本得到了以下仓库的帮助:laravel-friendships & laravel-follow。
变更日志
查看日志文件。