【问题标题】:Subscription won't update in database after subscription is updated in Stripe using Laravel Cashier and Jenssegers MongoDB使用 Laravel Cashier 和 Jenssegers MongoDB 在 Stripe 中更新订阅后,订阅不会在数据库中更新
【发布时间】:2020-05-18 00:01:19
【问题描述】:

我无法在 MongoDB 数据库中更新我的新订阅。我使用 Laravel Cashier、Stripe 和 Jenssegers MongoDB。

在条带仪表板中,用户已成功添加为客户和订阅者。

这是错误: [23:24:17] LOG.error:在 null 上调用成员函数 prepare() {"userId":"4ec1b45d36623t2269477d0...

这里是错误所在:

                return true;
        }

        $statement = $this->getPdo()->prepare($query);

        $this->bindValues($statement, $this->prepareBindings($bindings));

这是我的控制器:

namespace App\Http\Controllers;

use App\Plan;
use App\User;
use Exception;
use Illuminate\Http\Request;





class CheckoutController extends Controller
{
 /**
 * The collection name
 *
 * @var array
 */

public function checkout($plan_id)
{
    $plan = Plan::findOrFail($plan_id);
    $intent = auth()->user()->createSetupIntent();
    return view('billing.checkout', compact('plan', 'intent'));
}

public function process(Request $request)
{
    $plan = Plan::findOrFail($request->input('billing_plan_id'));
    try {
        auth()->user()->newSubscription($plan->name, $plan->stripe_plan_id)- 
>create($request->input('payment-method'));
        return redirect()->route('billing')->withMessage('Subscribed Successfully');
    } catch (Exception $e) {
        return redirect()->back()->withError($e->getMessage());
    }
}

这是我的用户模型:

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Model;
use Jenssegers\Mongodb\Auth\User as Authenticatable;
use Laravel\Cashier\Billable;
use Illuminate\Foundation\Auth;

class User extends Authenticatable
{

use  Billable, Notifiable;


protected $connection = 'mongodb';


/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
 protected $fillable = [
    'name', 'email', 'username', 'password', 'phone', 'last_login_at', 
'last_login_ip',
];
/**
 * The collection name
 *
 * @var array
 */
 protected $table = 'users';



 /**
  * The attributes that are mass assignable.
  *
  * @var array
  */
   protected $dates = ['deleted_at'];
 /**
  * The attributes that should be hidden for arrays.
  *
  * @var array
  */
 protected $hidden = [
    'password', 'remember_token',
];

/**
 * The attributes that should be cast to native types.
 *
 * @var array
 */
protected $casts = [
    'email_verified_at' => 'datetime',
];

}

这是我的计划模型: 命名空间应用程序;

use Jenssegers\Mongodb\Eloquent\Model;


/**
 * @method static findOrFail($plan_id)
 */
class Plan extends Model
{

 protected $fillable = [
     'name',
    'price',
    'stripe_plan_id'
];

}

这是我的订阅迁移:

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Migrations\Migration;
use Jenssegers\Mongodb\Schema\Blueprint;





class CreateSubscriptionsTable extends Migration
{
/**
 * The name of the database connection to use.
 *
 * @var string
 */
protected $connection = 'mongodb';



public function up()
{
    Schema::create('subscriptions', function (Blueprint $collection) {
        $collection->bigIncrements('id');
        $collection->unsignedBigInteger('userid');
        $collection->string('name');
        $collection->string('stripe_id');
        $collection->string('stripe_status');
        $collection->string('stripe_plan')->nullable()->change();
        $collection->integer('quantity')->nullable()->change();
        $collection->timestamp('trial_ends_at')->nullable();
        $collection->timestamp('ends_at')->nullable();
        $collection->timestamps();
        $collection->index(['user_id', 'stripe_status']);
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('subscriptions');
}
}

请帮我找出这个问题的根源以及如何解决它。

【问题讨论】:

    标签: php laravel laravel-cashier jenssegers-mongodb


    【解决方案1】:

    确保调用 $this->getPdo() 的模型(我猜它是一个模型,但你没有提及/展示它)正在扩展 Jenssegers 雄辩的模型类而不是 Laravel。

    例如:

    替换

    class MyModel extends Model
    

    class MyModel extends \Jenssegers\Mongodb\Eloquent\Model
    

    【讨论】:

    • 我在这篇文章中添加了我的模型和迁移。将 \Jenssegers\Mongodb\Eloquent\Model 添加到用户和计划模型后,我仍然得到错误。
    • $statement = $this->getPdo()->prepare($query); 来自哪里?是在 Jessengers 包中还是在您的代码中?
    • 它来自…/vendor/laravel/framework/src/Illuminate/Database/Connection.php 457
    • 我看不到在 Connection.php 中添加 /Jenssegers\Mongodb\Eloquent\Model 的位置,我看到 $statement = $this->getPdo()->prepare($query);跨度>
    【解决方案2】:

    部分解决方案: 虽然我在下面遇到同样的错误

    "Call to a member function prepare() on null {"userId":"4ec1b45d36623t2269477d0...".
    

    为了在数据库中更新订阅,我进入 Cashier 中的 Subscription.php 文件并替换了

    use Illuminate\Database\Eloquent\Model; 
    

    use Jenssegers\Mongodb\Eloquent\Model;
    

    这将修复数据库更新问题,但 Connection.php 文件中仍有一些奇怪的事情导致错误。

     $statement = $this->getPdo()->prepare($query);
    

    【讨论】:

    • 不要忘记在 SubscriptionItem.php 中进行相同的更改,这为我解决了问题!
    猜你喜欢
    • 2017-08-20
    • 2016-08-04
    • 2021-11-13
    • 1970-01-01
    • 2019-02-15
    • 2021-10-24
    • 2021-04-01
    • 2016-03-10
    • 2020-07-25
    相关资源
    最近更新 更多