overtrue/laravel-follow

Laravel 用户关注/取消关注系统。

资助包维护!
overtrue

安装次数: 329,049

依赖者: 10

建议者: 0

安全: 0

星标: 1,185

关注者: 24

分支: 134

开放问题: 0

5.2.0 2024-03-13 05:04 UTC

README

Laravel 用户关注/取消关注系统。

Latest Stable Version Latest Unstable Version Build Status Scrutinizer Code Quality Total Downloads License

相关项目

Sponsor me

安装

composer require overtrue/laravel-follow -vvv

配置和迁移

php artisan vendor:publish --provider="Overtrue\LaravelFollow\FollowServiceProvider"

使用方法

特性

Overtrue\LaravelFollow\Traits\Follower

将 Follower 特性添加到您的用户模型中

use Overtrue\LaravelFollow\Traits\Follower;

class User extends Authenticatable
{
    use Follower;

    <...>
}

Overtrue\LaravelFollow\Traits\Followable

然后,将 Followable 特性添加到您的 followable 模型中,例如 App\User

use Overtrue\LaravelFollow\Traits\Followable;

class User extends Authenticatable
{
    use Followable;
    <...>
}

或任何其他模型

use Overtrue\LaravelFollow\Traits\Followable;

class Channel extends Model
{
    use Followable;
    <...>
}

API

$user1 = User::find(1);
$user2 = User::find(2);

$user1->follow($user2);
$user1->unfollow($user2);
$user1->toggleFollow($user2);
$user1->acceptFollowRequestFrom($user2);
$user1->rejectFollowRequestFrom($user2);

$user1->isFollowing($user2);
$user2->isFollowedBy($user1);
$user2->hasRequestedToFollow($user1);

获取关注者

$user->followings;
$user->approvedFollowings;
$user->notApprovedFollowings;
foreach($user->followings()->with('followable')->get() as $following)
{
    $following->created_at; // followed at
    
    $following->followable->nickname; // the user attributes
}

获取粉丝

$user->followers;
$user->approvedFollowers;
$user->notApprovedFollowers;
foreach($user->followers()->with('followers')->get() as $follower)
{
    $follower->created_at; // followed at
    
    $follower->follower->nickname; // the user attributes
}

关注请求

如果您希望某些关注请求需要被被关注者接受,只需在具有 Followable 特性的模型中重写 needsToApproveFollowRequests() 方法,并添加您自定义的逻辑即可

public function needsToApproveFollowRequests()
{
    // Your custom logic here
    return (bool) $this->private;
}

聚合

// followings count
$user->followings()->count();
$user->approvedFollowings()->count();
$user->notApprovedFollowings()->count();

// with query where
$user->followings()->where('gender', 'female')->count();

// followers count
$user->followers()->count();
$user->approvedFollowers()->count();
$user->notApprovedFollowers()->count();

使用 *_count 属性列出

$users = User::withCount(['followings', 'followables'])->get();
// or 
$users = User::withCount(['approvedFollowings', 'approvedFollowers'])->get();

foreach($users as $user) {
    // $user->followings_count;
    // $user->followers_count;
    // or 
    // $user->approved_followings_count;
    // $user->approved_followers_count;
}

将用户关注状态附加到 followable 集合中

您可以使用 Follower::attachFollowStatus(Collection $followables) 来附加用户关注状态,它将为 $followables 中的每个模型设置 has_followed 属性

对于模型

$user1 = User::find(1);

$user->attachFollowStatus($user1);

// result
[
    "id" => 1
    "name" => "user1"
    "private" => false
    "created_at" => "2021-06-07T15:06:47.000000Z"
    "updated_at" => "2021-06-07T15:06:47.000000Z"
    "has_followed" => true  
  ]

对于 Collection | Paginator | LengthAwarePaginator | array

$user = auth()->user();

$users = User::oldest('id')->get();

$users = $user->attachFollowStatus($users);

$users = $users->toArray();

// result
[
  [
    "id" => 1
    "name" => "user1"
    "private" => false
    "created_at" => "2021-06-07T15:06:47.000000Z"
    "updated_at" => "2021-06-07T15:06:47.000000Z"
    "has_followed" => true  
  ],
  [
    "id" => 2
    "name" => "user2"
    "private" => false
    "created_at" => "2021-06-07T15:06:47.000000Z"
    "updated_at" => "2021-06-07T15:06:47.000000Z"
    "has_followed" => true
  ],
  [
    "id" => 3
    "name" => "user3"
    "private" => false
    "created_at" => "2021-06-07T15:06:47.000000Z"
    "updated_at" => "2021-06-07T15:06:47.000000Z"
    "has_followed" => false
  ],
  [
    "id" => 4
    "name" => "user4"
    "private" => false
    "created_at" => "2021-06-07T15:06:47.000000Z"
    "updated_at" => "2021-06-07T15:06:47.000000Z"
    "has_followed" => false
  ],
]

对于分页

$users = User::paginate(20);

$user->attachFollowStatus($users);

按粉丝数量排序

您可以使用以下方法查询按粉丝数量排序的用户

  • orderByFollowersCountDesc()
  • orderByFollowersCountAsc()
  • orderByFollowersCount(string $direction = 'desc')

示例

$users = User::orderByFollowersCountDesc()->get();
$mostPopularUser = User::orderByFollowersCountDesc()->first();

N+1 问题

为了避免 N+1 问题,您可以使用预加载来将此操作减少为仅2个查询。查询时,您可以使用 with 方法指定哪些关系应该被预加载

$users = User::with('followings')->get();

foreach($users as $user) {
    $user->isFollowing(2);
}

$users = User::with('followables')->get();

foreach($users as $user) {
    $user->isFollowedBy(2);
}

事件

❤️ 赞助我

Sponsor me

如果您喜欢我的项目并想支持它,点击这里 ❤️

项目由 JetBrains 支持

非常感谢 JetBrains 好意提供许可证,使我能够参与此和其他开源项目。

贡献

您可以通过以下三种方式之一进行贡献

  1. 使用 问题跟踪器 提交错误报告。
  2. 问题跟踪器 上回答问题或修复错误。
  3. 贡献新功能或更新 wiki。

代码贡献过程并不非常正式。您只需要确保您遵循 PSR-0、PSR-1 和 PSR-2 编码指南。任何新的代码贡献都必须附有适用时的单元测试。

PHP 扩展包开发

想知道如何从零开始构建 PHP 扩展包?

请关注我的实战课程,我将在该课程中分享一些扩展开发经验 —— 《PHP 扩展包实战教程 - 从入门到发布》

许可证

MIT