带条纹的Laravel收银员,错误检查订阅状态

时间:2016-10-17 20:54:01

标签: laravel laravel-5 laravel-cashier

使用以下方法检查订阅状态时出现以下错误:

$user = User::where('id', '=', \Auth::user()->id)->first();

if ($user->subscribed('main')) <-- error

错误:

ErrorException in Builder.php line 2405: Call to undefined method
     Illuminate\Database\Query\Builder::valid() (View: /var/www/html...

 in Builder.php line 2405
at Builder->__call('valid', array())
at Builder->valid()
at call_user_func_array(array(object(Builder), 'valid'), array()) in Builder.php line 1426
at Builder->__call('valid', array())
at Builder->valid()
at call_user_func_array(array(object(Builder), 'valid'), array()) in Relation.php line 343
at Relation->__call('valid', array()) in Billable.php line 172
at HasMany->valid() in Billable.php line 172
at User->subscribed('main') in BillingsController.php line 58
at BillingsController->index()

在同一视图中使用$user->onGenericTrial()$user->onTrial()方法时,我没有遇到任何问题。

我使用以下方式创建了一个新订阅:

$user = User::find(1);
$user->newSubscription('main', 'monthly')->create($creditCardToken);

我正在使用Laravel 5.2和Cashier 6.0。我在这里跟踪了文档https://laravel.com/docs/5.2/billing#checking-subscription-status

在我的用户模型中,我使用Laravel \ Cashier \ Billable;并使用Billable;并且我的订阅模型上有很多内容。我的订阅模型具有belongsTo用户关系

用户模型

<?php namespace App;

use Laravel\Cashier\Billable;

use Carbon\Carbon;

class User extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract {

    use Authenticatable, Authorizable, CanResetPassword;

    public $incrementing = true;

    use SoftDeletes;

    use Billable;

    protected $dates = ['deleted_at'];

    protected $table = 'users';

    protected $fillable = [ ...  'stripe_id', 'card_brand', 'card_last_four', 'trial_ends_at'];


    public function subscription()
    {
        return $this->hasMany('App\Subscription');
    }

    public function getTrialEndsAtAttribute($value)
    {
        $format = $this->getDateFormat();   
        return  Carbon::createFromFormat($format, $value, 'UTC')->setTimezone(\Helper::getTimezone());
    }   

这是发生错误的地方:

https://github.com/laravel/cashier/blob/6.0/src/Billable.php

public function subscribed($subscription = 'default', $plan = null)
{
    $subscription = $this->subscription($subscription);
    if (is_null($subscription)) {
        return false;
    }
    if (is_null($plan)) {
        return $subscription->valid();
    }
    return $subscription->valid() &&
           $subscription->stripe_plan === $plan;
}

解决方案:

终于找到了问题!不得在用户和订阅模型之间创建关系。我在User模型上有hasMany关系,在Subscription模型上有belongsTo关系。这就是问题所在。

1 个答案:

答案 0 :(得分:1)

你可以尝试并运行:

$user->first()->subscribed('main');

看看是否会抛出相同的错误,我问这个的原因是因为如果没有实例化完整对象,Illuminate查询构建器可以抛出未定义的方法。

我不是一个laravel专业人士,但我自己曾多次面对这个问题,让我举个例子说明我今天如何克服类似的问题。

返回$user->payments()->first()->fetchMostRecent($customArrayValues)->first();

$user->subscription();$user->subscription()->first();返回的是什么,此函数是否会返回预期的内容?

正如我所说,我绝不是一个赞成laravel然而我会尝试帮助我尽我所能,我相信更高级的人在这里也将提供帮助,因为查询生成器错误异常可能是一个痛苦在后面!