You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Cashier关联模型从User改为Hotel后调用createOrGetStripeCustomer报错如何解决

错误原因

你已经将Billable trait从User模型移除、改为绑定到Hotel模型,同时Cashier配置的默认关联模型也改成了Hotel,因此User模型本身已经不存在Cashier提供的createOrGetStripeCustomer方法,你在控制器中调用$user->createOrGetStripeCustomer()自然会报错。


修复方案

因为你的需求是每个酒店独立维护支付信息,所以所有Cashier相关的操作都需要在Hotel实例上调用,而不是User实例,按以下步骤修改即可:

  1. 调整控制器逻辑,先获取当前要操作的、属于当前登录用户的酒店实例,再调用Cashier方法,示例代码如下:
public function get(Request $request)
{
    $creditorId = config('id');
    $user = $request->user();
    // 先获取当前要操作的酒店,这里要加user_id校验防止越权访问其他用户的酒店
    $hotel = Hotel::where('user_id', $user->id)->findOrFail($request->input('hotel_id'));
    // 调用Hotel实例的Cashier方法
    $stripeCustomer = $hotel->createOrGetStripeCustomer();
    // 后续所有支付、订阅相关操作都基于当前$hotel实例执行
    .............
}
  1. 后续所有支付方式绑定、订阅创建、账单生成等Cashier相关操作,统一改为绑定到对应的Hotel实例即可。

额外校验项

  • 确认你已经将Cashier要求的所有默认字段(stripe_id、pm_type、pm_last_four、trial_ends_at等)完整迁移到hotel表,字段类型、长度和Cashier要求保持一致
  • 如果需要查询某个用户名下所有酒店的支付信息,直接遍历该用户关联的Hotel集合,分别读取每个酒店的支付字段即可

内容的提问来源于stack exchange,提问作者GPiter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 13:54:04