multicaret / 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-09-08 14:33:27 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
特质添加到用户模型中。
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; }
向目标模型(如'Post'或'Book'等)添加CanBeXXX
特性。
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);
事件
这是每个操作默认触发的事件的列表
贡献
参阅CONTRIBUTING指南。
该库的初始版本由以下存储库协助laravel-friendships和laravel-follow。
变更日志
参阅日志文件。