overtrue/laravel-subscribe

Laravel 应用程序的订阅/退订功能。

4.3.1 2024-09-18 16:36 UTC

This package is auto-updated.

Last update: 2024-09-19 01:53:01 UTC


README

📧 Laravel 应用程序的订阅/退订功能。

CI

Sponsor me

安装

$ composer require overtrue/laravel-subscribe -vvv

配置

此步骤是可选的

$ php artisan vendor:publish --provider="Overtrue\\LaravelSubscribe\\SubscribeServiceProvider" --tag=config

迁移

您需要发布迁移文件以使用此包

$ php artisan vendor:publish --provider="Overtrue\\LaravelSubscribe\\SubscribeServiceProvider" --tag=migrations

用法

特质

Overtrue\LaravelSubscribe\Traits\Subscriber

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Overtrue\LaravelSubscribe\Traits\Subscriber;

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

Overtrue\LaravelSubscribe\Traits\Subscribable

use Illuminate\Database\Eloquent\Model;
use Overtrue\LaravelSubscribe\Traits\Subscribable;

class Post extends Model
{
    use Subscribable;

    <...>
}

API

$user = User::find(1);
$post = Post::find(2);

$user->subscribe($post);
$user->unsubscribe($post);
$user->toggleSubscribe($post);

$user->hasSubscribed($post); 
$post->isSubscribedBy($user); 
获取对象订阅者
foreach($post->subscribers as $user) {
    // echo $user->name;
}
聚合
// all
$user->subscriptions()->count(); 

// with type
$user->subscriptions()->withType(Post::class)->count(); 

// subscribers count
$post->subscribers()->count();

使用 *_count 属性列出

$users = User::withCount('subscriptions')->get();

foreach($users as $user) {
    echo $user->subscriptions_count;
}

筛选可订阅项

$posts = Post::hasSubscribers($user)->get();
$posts = Post::hasSubscribers($user->id)->get();
$posts = Post::hasSubscribers([$user1, $user2])->get();
$posts = Post::hasSubscribers([$user1->id, $user2->id])->get();

// or
$posts = Post::subscribedBy($user)->get();
$posts = Post::subscribedBy($user->id)->get();
$posts = Post::subscribedBy([$user1, $user2])->get();
$posts = Post::subscribedBy([$user1->id, $user2->id])->get();

按订阅者数量排序

您可以使用以下方法按订阅者数量对可订阅模型进行查询排序

  • orderBySubscribersCountDesc()
  • orderBySubscribersCountAsc()
  • orderBySubscribersCount(string $direction = 'desc')

示例

$posts = Post::orderBySubscribersCountDesc()->get();
$mostPopularPost = Post::orderBySubscribersCountDesc()->first();

N+1 问题

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

// Subscriber
$users = App\User::with('subscriptions')->get();

foreach($users as $user) {
    $user->hasSubscribed($post);
}

// Subscribable
$posts = App\Post::with('subscriptions')->get();
// or 
$posts = App\Post::with('subscribers')->get();

foreach($posts as $post) {
    $post->isSubscribedBy($user);
}

将订阅状态附加到可订阅集合

您可以使用 Subscriber::attachSubscriptionStatus(Collection $subscribeables) 将用户订阅状态附加,它将为 $subscribables 中的每个模型设置 has_subscribed 属性

对于模型

$user1 = User::find(1);

$user->attachSubscriptionStatus($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_subscribed" => true  
  ]

对于 Collection | Paginator | LengthAwarePaginator | array

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

$posts = Post::oldest('id')->get();

$posts = $user->attachSubscriptionStatus($posts);

$posts = $posts->toArray();

// result
[
  [
    "id" => 1
    "title" => "title 1"
    "created_at" => "2021-06-07T15:06:47.000000Z"
    "updated_at" => "2021-06-07T15:06:47.000000Z"
    "has_subscribed" => true  
  ],
  [
    "id" => 2
    "title" => "title 2"
    "created_at" => "2021-06-07T15:06:47.000000Z"
    "updated_at" => "2021-06-07T15:06:47.000000Z"
    "has_subscribed" => true
  ],
  [
    "id" => 3
    "title" => "title 3"
    "created_at" => "2021-06-07T15:06:47.000000Z"
    "updated_at" => "2021-06-07T15:06:47.000000Z"
    "has_subscribed" => false
  ],
  [
    "id" => 4
    "title" => "title 4"
    "created_at" => "2021-06-07T15:06:47.000000Z"
    "updated_at" => "2021-06-07T15:06:47.000000Z"
    "has_subscribed" => false
  ],
]

对于分页

$posts = Post::paginate(20);

$user->attachSubscriptionStatus($posts);

事件

相关包

❤️ 赞助我

Sponsor me

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

由 JetBrains 支持的项目

非常感谢 JetBrains 慷慨提供许可证,使我能够从事此项目和其它开源项目的工作。

贡献

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

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

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

PHP 扩展包开发

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

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

许可证

MIT