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

Laravel Stripe:如何查询关联无订阅客户的Charge记录?

嘿,我来帮你搞定这个查询需求!你之前写的Charge::all([...])其实不符合Eloquent的查询逻辑,all()方法是直接获取所有Charge实例,没法通过这种参数来过滤关联关系。不过Laravel提供了非常流畅的链式查询方法来实现这个需求,核心就是用whereDoesntHave——这个方法专门用来筛选关联关系不存在的模型。

实现前提

首先得确保你的模型关联已经正确定义:

  • 在Charge模型里要有关联Customer的方法,比如:
    public function customer()
    {
        return $this->belongsTo(Customer::class);
    }
    
  • 在Customer模型里要有关联Subscription的方法,比如:
    public function subscriptions()
    {
        return $this->hasMany(Subscription::class);
    }
    

流畅的链式查询写法

接下来就可以用简洁的链式调用来获取目标Charge记录了:

$charges = Charge::whereDoesntHave('customer.subscriptions')->get();

如果之后需要给订阅添加额外的过滤条件(比如排除特定状态的订阅,但当前需求是要完全没有订阅,所以这个闭包可以省略),也可以传入闭包细化规则:

$charges = Charge::whereDoesntHave('customer.subscriptions', function ($query) {
    // 示例:如果需要排除已过期的订阅(当前需求不需要,仅作演示)
    // $query->where('status', '!=', 'expired');
})->get();

逻辑解释

whereDoesntHave('customer.subscriptions')的作用是:自动生成子查询,筛选出所有Charge——它们关联的Customer没有任何Subscription记录。这个方法帮你处理了关联表的JOIN和 EXISTS 判断,比手动写原生SQL要简洁易读得多。

内容的提问来源于stack exchange,提问作者Mike Kevin Castro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:08:00