如何自定义Laravel Cashier默认用户模型/表?改用租户表存订阅信息
如何将Laravel Cashier的默认订阅表改为自定义tenant表
1. 让Tenant模型继承Billable trait
将Laravel Cashier的Billable trait从User模型转移到你的Tenant模型上,这是核心步骤:
namespace App\Models; use Laravel\Cashier\Billable; use Illuminate\Database\Eloquent\Model; class Tenant extends Model { use Billable; // 根据你的业务需求配置模型属性 protected $fillable = ['name', 'email', 'phone']; }
2. 给tenant表添加Cashier所需字段
Cashier默认会给users表添加订阅相关字段,现在你需要手动给tenant表创建迁移:
php artisan make:migration add_cashier_fields_to_tenants_table
在生成的迁移文件中添加以下字段:
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up() { Schema::table('tenants', function (Blueprint $table) { $table->string('stripe_id')->nullable()->index(); $table->string('pm_type')->nullable(); $table->string('pm_last_four')->nullable(); $table->timestamp('trial_ends_at')->nullable(); }); } public function down() { Schema::table('tenants', function (Blueprint $table) { $table->dropColumn(['stripe_id', 'pm_type', 'pm_last_four', 'trial_ends_at']); }); } };
运行迁移生效:
php artisan migrate
3. 调整订阅模型的关联关系
Cashier的默认Subscription模型关联的是User表,需要修改为关联Tenant表。你可以创建自定义Subscription模型来覆盖默认逻辑:
namespace App\Models; use Laravel\Cashier\Subscription as CashierSubscription; class Subscription extends CashierSubscription { // 重写user关联,指向Tenant模型 public function user() { return $this->belongsTo(Tenant::class, 'user_id'); } }
然后在Tenant模型中指定使用这个自定义Subscription模型:
namespace App\Models; use Laravel\Cashier\Billable; use Illuminate\Database\Eloquent\Model; use App\Models\Subscription; class Tenant extends Model { use Billable; protected $fillable = ['name', 'email', 'phone']; protected function subscriptionsModel() { return Subscription::class; } }
4. 全局配置Cashier默认模型(可选)
发布Cashier配置文件:
php artisan vendor:publish --tag="cashier-config"
在config/cashier.php中修改默认模型为Tenant:
'model' => App\Models\Tenant::class,
5. 使用Tenant模型处理订阅逻辑
之后所有订阅操作都通过Tenant模型完成,示例代码:
// 创建新订阅 $tenant = Tenant::find(1); $tenant->newSubscription('default', 'your_stripe_price_id')->create($paymentMethod); // 获取租户订阅信息 $subscription = $tenant->subscription('default'); // 取消订阅 $tenant->subscription('default')->cancel();
内容的提问来源于stack exchange,提问作者Faizan Dayo
相关产品推荐
相关产品推荐

