aytaceminoglu / laravel-follow
Laravel 用户关注/取消关注系统。
5.x-dev
2022-10-14 16:11 UTC
Requires
- laravel/framework: ^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.8
- mockery/mockery: ^1.5
- orchestra/testbench: ^7.4
- phpunit/phpunit: ^9.5
This package is auto-updated.
Last update: 2024-09-14 20:21:32 UTC
README
Laravel 用户关注/取消关注系统。
相关项目
- 喜欢: overtrue/laravel-like
- 收藏: overtrue/laravel-favorite
- 订阅: overtrue/laravel-subscribe
- 投票: overtrue/laravel-vote
安装
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); }
事件
❤️ 赞助我
如果您喜欢我的项目并想支持它,点击这里 ❤️
由 JetBrains 支持的项目
感谢 JetBrains 好意提供许可证,让我能够为这个和其他开源项目工作。
贡献
您可以通过以下三种方式之一进行贡献
代码贡献过程并不非常正式。您只需确保遵循 PSR-0、PSR-1 和 PSR-2 编码规范。任何新的代码贡献都必须伴随适用的单元测试。
PHP 扩展包开发
想知道如何从头开始构建 PHP 扩展包吗?
请关注我的实战课程,我将在该课程中分享一些扩展开发经验 —— 《PHP 扩展包实战教程 - 从入门到发布》
许可
MIT