elemenx / laravel-acquaintances
这个轻量级的包,无依赖项,为Eloquent模型提供了管理好友关系(及分组)的能力。同时支持以下互动功能:点赞、收藏、投票、订阅、关注等。还包括高级评分系统。
Requires
- php: >=7.1
Requires (Dev)
- codeclimate/php-test-reporter: ^0.3.2
- doctrine/dbal: ^2.5
- fzaninotto/faker: ~1.4
- laravel/laravel: 5.*
- mockery/mockery: 1.0.x-dev
- phpunit/phpunit: 5.*
README
支持Laravel 8及以下版本,无依赖项
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 elemenx/laravel-acquaintances
Laravel 5.8及更高版本 => 版本 2.x(master分支)
Laravel 5.7及以下版本 => 版本 1.x(v1分支)
Laravel 5.4及以下版本
然后,在 config/app.php
中包含服务提供者。
'providers' => [ // ... ElemenX\Acquaintances\AcquaintancesServiceProvider::class, // ... ];
发布配置和迁移
$ php artisan vendor:publish --provider="ElemenX\Acquaintances\AcquaintancesServiceProvider"
在
config\acquaintances.php
最后,迁移数据库以创建表
$ php artisan migrate
设置模型
示例
use ElemenX\Acquaintances\Traits\Friendable; use ElemenX\Acquaintances\Traits\CanFollow; use ElemenX\Acquaintances\Traits\CanBeFollowed; use ElemenX\Acquaintances\Traits\CanLike; use ElemenX\Acquaintances\Traits\CanBeLiked; use ElemenX\Acquaintances\Traits\CanRate; use ElemenX\Acquaintances\Traits\CanBeRated; //... class User extends Model { use Friendable; use CanFollow, CanBeFollowed; use CanLike, CanBeLiked; use CanRate, CanBeRated; //... }
以下列出了好友关系与互动的所有可用API。
好友关系
好友请求
将 Friendable
特质添加到用户模型中。
use ElemenX\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->getPendingFriendships();
获取已接受好友关系列表
$user->getAcceptedFriendships();
获取拒绝好友关系列表
$user->getDeniedFriendships();
获取阻止好友关系列表
$user->getBlockedFriendships();
获取待处理好友请求列表
$user->getFriendRequests();
获取好友数量
$user->getFriendsCount();
获取待处理请求数量
$user->getPendingsCount();
获取与另一个用户互为好友的数量
$user->getMutualFriendsCount($otherUser);
检索好友
要获取朋友模型的集合(例如User),请使用以下方法
getFriends()
$user->getFriends(); // or panigated $user->getFriends($perPage = 20, $group_name); // or paginated with certain fields $user->getFriends($perPage = 20, $group_name, $fields = ['id','name']);
参数
$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 ElemenX\Acquaintances\Traits\CanFollow; use ElemenX\Acquaintances\Traits\CanLike; use ElemenX\Acquaintances\Traits\CanFavorite; use ElemenX\Acquaintances\Traits\CanSubscribe; use ElemenX\Acquaintances\Traits\CanVote; class User extends Model { use CanFollow, CanLike, CanFavorite, CanSubscribe, CanVote; }
向目标模型添加 CanBeXXX
特性,例如 'Post' 或 'Book' ...
use ElemenX\Acquaintances\Traits\CanBeLiked; use ElemenX\Acquaintances\Traits\CanBeFavorited; use ElemenX\Acquaintances\Traits\CanBeVoted; use ElemenX\Acquaintances\Traits\CanBeRated; class Post extends Model { use CanBeLiked, CanBeFavorited, CanBeVoted, CanBeRated; }
所有可用的 API 列表如下。
关注
\ElemenX\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);
\ElemenX\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
评分
\ElemenX\Acquaintances\Traits\CanRate
$user->rate($targets); $user->unrate($targets); $user->toggleRate($targets); $user->ratings()->get(); // App\User:class $user->rateings(App\Post::class)->get(); $user->hasRated($target);
\ElemenX\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
点赞
\ElemenX\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();
\ElemenX\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
收藏
\ElemenX\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();
\ElemenX\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
订阅
\ElemenX\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();
ElemenX\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
投票
\ElemenX\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();
\ElemenX\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
参数
上述创建关系的方法,如 '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 ElemenX\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。
变更日志
请参阅 日志 文件。