0

サブスクリプションのステータスを確認すると、次のエラーが表示されます。

$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 を使用します。私のサブスクリプションモデルでは hasMany です。私のサブスクリプション モデルには、属しているユーザー関係があります

ユーザーモデル

<?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 関係がありました。それが問題でした。

4

1 に答える 1

1

試して実行できますか:

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

これが同じエラーをスローするかどうかを確認してください。これを尋ねる理由は、完全なオブジェクトがインスタンス化されていない場合、Illuminate クエリビルダーが未定義のメソッドをスローする可能性があるためです。

私はlaravelのプロではありませんが、この問題に何度か直面しました。今日、同様の問題をどのように克服したかの例を挙げましょう。

戻る$user->payments()->first()->fetchMostRecent($customArrayValues)->first();

また、あなたの$user->subscription();orは何$user->subscription()->first();を返しますか、この関数は期待されるものを返しますか?

私が言ったように、私は決してlaravelのプロではありませんが、できる限りのことをしようとします.クエリビルダーのエラー例外は背中の痛みになる可能性があるため、ここのより高度な人々も助けの手を差し伸べてくれると確信しています.側!

于 2016-10-18T01:20:41.163 に答える