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

如何在Query Builder中调用模型函数并筛选特定条件客户

解决方案:Query Builder调用模型函数及客户筛选问题

一、在Query Builder中调用模型函数的方法

Query Builder操作的是数据库查询构造器,而非模型实例,无法直接调用模型的实例方法。可以通过以下两种方式实现类似需求:

  1. 将模型逻辑转为查询作用域(Scope)
    把模型中判断状态的逻辑(比如订单是否活跃)封装成查询作用域,就能在Query Builder中直接调用。
    示例(以Order模型为例):
// Order模型中定义查询作用域
public function scopeInactive($query)
{
    // 对应你模型中判断订单非活跃/过期的逻辑,比如过期时间小于等于当前时间,或状态为非活跃
    return $query->where('expired_at', '<=', now())
                ->orWhere('status', '=', 'inactive');
}

之后在Query Builder中即可直接调用该作用域:

// 筛选非活跃订单
$inactiveOrders = Order::inactive()->get();
  1. 用whereRaw复用模型逻辑(不推荐,维护性差)
    如果模型中的函数是基于字段判断的逻辑,可以把逻辑转为原生SQL语句,用whereRaw嵌入到Query Builder中。比如模型中有isInactive()实例方法:
// 模型实例方法
public function isInactive()
{
    return $this->expired_at <= now() || $this->status === 'inactive';
}

转为Query Builder查询:

$inactiveOrders = Order::whereRaw('expired_at <= NOW() OR status = ?', ['inactive'])->get();

二、筛选目标客户的查询写法

假设Customer模型与Order模型是一对多关联(Customer有orders()关联方法),要筛选两类客户,直接通过关联查询组合条件即可:

$targetCustomers = Customer::whereDoesntHave('orders') // 筛选没有关联订单的客户
    ->orWhereHas('orders', function ($query) {
        // 筛选有订单但订单为非活跃/过期的客户,这里可直接调用上面定义的inactive作用域
        $query->inactive();
    })
    ->get();

逻辑说明:

  • whereDoesntHave('orders'):匹配未与Order建立任何关联的客户;
  • orWhereHas('orders', ...):匹配存在关联订单,但订单满足非活跃/过期条件的客户;
  • 两者通过or连接,最终得到两类目标客户的集合。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 00:25:31