heiheihallo / acquaintances
这是针对我们的需求定制的 multicaret/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.*
This package is auto-updated.
Last update: 2024-09-30 01:38:07 UTC
README
从 https://github.com/multicaret/laravel-acquaintances 分支 衍生,增加了不喜欢功能和 CanBe/CanDo 特性
支持 Laravel 9 及以下版本,无依赖
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 heiheihallo/acquaintances
Laravel 5.8 及以上版本 => 版本 2.x(master 分支)
Laravel 5.7 及以下版本 => 版本 1.x(v1 分支)
发布配置和迁移
php artisan vendor:publish --provider="HeiHeiHallo\Acquaintances\AcquaintancesServiceProvider"
在以下位置配置已发布的配置
config/acquaintances.php
最后,迁移数据库以创建表
php artisan migrate
设置模型
示例
use HeiHeiHallo\Acquaintances\Traits\Friendable; use HeiHeiHallo\Acquaintances\Traits\CanFollow; use HeiHeiHallo\Acquaintances\Traits\CanBeFollowed; use HeiHeiHallo\Acquaintances\Traits\CanLike; use HeiHeiHallo\Acquaintances\Traits\CanBeLiked; use HeiHeiHallo\Acquaintances\Traits\CanRate; use HeiHeiHallo\Acquaintances\Traits\CanBeRated; //... class User extends Model { use Friendable; use CanFollow, CanBeFollowed; use CanLike, CanBeLiked; use CanRate, CanBeRated; //... }
以下列出了所有可用的 API,用于友情和交互。
友情
好友请求
将 Friendable
特性添加到 User 模型。
use HeiHeiHallo\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->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 HeiHeiHallo\Acquaintances\Traits\CanFollow; use HeiHeiHallo\Acquaintances\Traits\CanLike; use HeiHeiHallo\Acquaintances\Traits\CanFavorite; use HeiHeiHallo\Acquaintances\Traits\CanSubscribe; use HeiHeiHallo\Acquaintances\Traits\CanVote; class User extends Model { use CanFollow, CanLike, CanFavorite, CanSubscribe, CanVote; }
向目标模型(如'Post'或'Book'等)添加CanBeXXX
特性。
use HeiHeiHallo\Acquaintances\Traits\CanBeLiked; use HeiHeiHallo\Acquaintances\Traits\CanBeFavorited; use HeiHeiHallo\Acquaintances\Traits\CanBeVoted; use HeiHeiHallo\Acquaintances\Traits\CanBeRated; class Post extends Model { use CanBeLiked, CanBeFavorited, CanBeVoted, CanBeRated; }
所有可用的API如下所示。
关注
\HeiHeiHallo\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);
\HeiHeiHallo\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
评分
\HeiHeiHallo\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
\HeiHeiHallo\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
赞
\HeiHeiHallo\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();
\HeiHeiHallo\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
不喜欢
\HeiHeiHallo\Acquaintances\Traits\CanDislike
$user->dislike($targets); $user->undislike($targets); $user->toggleDislike($targets); $user->hasDisliked($target); $user->dislikes()->get(); // default object: App\User:class $user->dislikes(App\Post::class)->get();
\HeiHeiHallo\Acquaintances\Traits\CanBeDisliked
$object->dislikers()->get(); $object->haters()->get(); // or $object->haters. it's an alias of dislikers() $object->isDislikedBy($user); $object->dislikersCount(); // or as attribute $object->dislikers_count $object->dislikersCountReadable(); // return readable number with precision, i.e: 5.2K
收藏
\HeiHeiHallo\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();
\HeiHeiHallo\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
订阅
\HeiHeiHallo\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();
HeiHeiHallo\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
投票
\HeiHeiHallo\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();
\HeiHeiHallo\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
查看
\HeiHeiHallo\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();
\HeiHeiHallo\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 HeiHeiHallo\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-acquaintances、laravel-friendships和laravel-follow。
变更日志
参见日志文件。