liliom/laravel-acquaintances

此包已被废弃,不再维护。作者建议使用multicaret/laravel-acquaintances包。

此轻量级包无依赖,为Eloquent模型提供了管理友情(及群组)的能力。包括以下交互功能:点赞、收藏、投票、订阅、关注等。还包含高级评分系统。

v3.6.1 2024-06-08 13:48 UTC

README

Total Downloads Latest Version License

68747470733a2f2f63646e2e6d756c746963617265742e636f6d2f7061636b616765732f6173736574732f696d672f6c61726176656c2d6163717561696e74616e6365732e7376673f757064617465643d33

Laravel新闻文章

支持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);
  1. 简介
  2. 安装
  3. 友情
  4. 交互
  5. 事件
  6. 贡献

简介

此轻量级包为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

变更日志

查看日志文件。