heiheihallo/acquaintances

这是针对我们的需求定制的 multicaret/laravel-acquaintances 的克隆版本。增加了不喜欢功能。这个无依赖的轻量级包,为 Eloquent 模型提供了管理友情(及群组)的能力。以及以下交互功能:赞、收藏、投票、订阅、关注等。

v1.1.2 2023-03-02 14:04 UTC

This package is auto-updated.

Last update: 2024-09-30 01:38:07 UTC


README

Total Downloads Latest Version License

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

简介

这个轻量级包为 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-acquaintanceslaravel-friendshipslaravel-follow

变更日志

参见日志文件。