Laravel Cashier关联模型从User改为Hotel后调用createOrGetStripeCustomer报错如何解决
错误原因
你已经将Billable trait从User模型移除、改为绑定到Hotel模型,同时Cashier配置的默认关联模型也改成了Hotel,因此User模型本身已经不存在Cashier提供的createOrGetStripeCustomer方法,你在控制器中调用$user->createOrGetStripeCustomer()自然会报错。
修复方案
因为你的需求是每个酒店独立维护支付信息,所以所有Cashier相关的操作都需要在Hotel实例上调用,而不是User实例,按以下步骤修改即可:
- 调整控制器逻辑,先获取当前要操作的、属于当前登录用户的酒店实例,再调用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实例执行 ............. }
- 后续所有支付方式绑定、订阅创建、账单生成等Cashier相关操作,统一改为绑定到对应的
Hotel实例即可。
额外校验项
- 确认你已经将Cashier要求的所有默认字段(
stripe_id、pm_type、pm_last_four、trial_ends_at等)完整迁移到hotel表,字段类型、长度和Cashier要求保持一致 - 如果需要查询某个用户名下所有酒店的支付信息,直接遍历该用户关联的
Hotel集合,分别读取每个酒店的支付字段即可
内容的提问来源于stack exchange,提问作者GPiter
相关产品推荐
相关产品推荐

