【问题标题】:Laravel Cashier Multiple PlansLaravel 收银员多个计划
【发布时间】:2021-02-26 05:40:48
【问题描述】:

任何人都使用过 Laravel Cashier,并且对我的以下问题有答案。 我想取消订阅,并且在文档中是这样写的

$user->subscription('default')->cancelNow();

在我的情况下,用户拥有一个地方,我在订阅迁移中添加了一个额外的表,即“place_id”,并且他拥有的每个地方都有多个订阅,我可以让上面的代码更具体并写这样的东西吗他可以取消对他拥有的地方的特定订阅

$user->subscription($planName)->where('place_id','=',$placeID)->cancelNow()

还尝试了订阅查询

$subscription = Subscription::query()->active()->
where(['place_id', '=', $placeID], ['user_id', '=', $user->id])->get();

$subscription->cancelNow()

没用,只是我试过了,有人有什么想法吗?我只是在寻找一种使用更具体的代码取消订阅的方法,而不仅仅是订阅的名称。 谢谢和问候!

【问题讨论】:

    标签: php laravel laravel-cashier


    【解决方案1】:

    我有类似的情况,付费用户可以拥有多个订阅者和多个订阅者。我通过创建向订阅表添加 subscriber_id 字段的迁移来管理这一点

    Schema::table('subscriptions', function (Blueprint $table) {
        $table->integer('subscriber_id')->nullable()->after('user_id');
    });
    

    然后在创建订阅后更新该 ID。

    $subscription = $subscription->create($paymentMethod->id); // returns stripe subscription
    $subscription = Subscription::find($subscription->id); // so you have ot get the local subscription from the db
    $subscription->update(['subscriber_id' => $subscriber->id]);
    

    然后我可以通过订阅者 ID 和计划获取订阅者或特定订阅的所有订阅

    $subscription = Subscription::where('subscriber_id', $subscriber->id)->where('stripe_plan','your_plan')...```
    
    

    基本上你可以做同样的事情,但使用place_id

    【讨论】:

    • 这正是我所做的,但我无法让功能 cancelNow 工作,我应该在哪里使用它?
    • 错误是什么?你从$subscription = Subscription::query()->active()-> where(['place_id', '=', $placeID], ['user_id', '=', $user->id])->get(); 得到什么返回?你把结果扔掉了吗?您应该将其添加到您的问题中,因为您实际上询问了如何获取 sub 而不是为什么 cancelNow() 方法不适用于返回的订阅。你可能需要asStripeSubscription()
    • 问题没有说明如何获得订阅,而是说明如何取消特定订阅。
    • 您需要发布您的错误和查询返回的结果
    • 没有错误,它正确返回订阅,我只是找不到取消返回订阅的方法。
    【解决方案2】:

    所以我解决了我的问题,而不是使用

    ->get(); 
    

    我用过:

    ->first();
    

    像这样:

    $subscription = Subscription::query()->active()->where([['place_id', '=', $placeID], ['user_id', '=', $user->id]])->first();
    
    $subscription->cancelNow();
    

    这是因为 first() 方法将只返回一条记录,而 get() 方法将返回一个记录数组,即使在我的情况下它只返回一条记录,因为它应该返回,但 first() 成功了工作,它解决了我的问题。

    【讨论】:

    • 因此我说您需要发布查询返回的结果。如果它是一个数组或集合,它会立即显而易见。获得一个好的答案需要一个精心设计的问题,其中包含尽可能多的细节:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-08
    • 2018-11-07
    • 2017-11-24
    • 2021-02-21
    • 2014-10-28
    • 2018-03-28
    • 2018-06-17
    相关资源
    最近更新 更多