aytaceminoglu/laravel-follow

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

5.x-dev 2022-10-14 16:11 UTC

This package is auto-updated.

Last update: 2024-09-14 20:21:32 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

使用方法

特质

Overtrue\LaravelFollow\Traits\Follower

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

use Overtrue\LaravelFollow\Traits\Follower;

class User extends Authenticatable
{
    use Follower;

    <...>
}

Overtrue\LaravelFollow\Traits\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;

获取粉丝

$user->followers;
$user->approvedFollowers;
$user->notApprovedFollowers;

关注请求

如果您希望某些关注请求需要被关注的用户接受,只需覆盖使用 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;
}

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

您可以使用 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