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

Laravel关联模型优化:从Client关联Invoice匹配Transaction的优雅实现

优化Laravel关联查询:从Client关联Invoice匹配Transaction记录

我在项目中有Client、Invoice、Transaction三个模型,Client与Invoice为一对多关联。需求是从指定Client的所有Invoice中提取gross_price,再匹配Transaction表中price字段与之对应的记录。现有实现代码如下:

当前Client模型代码

class Client extends Model
{
    public function invoices()
    {
        return $this->hasMany(Invoice::class);
    }
    
    public function priceInvoices()
    {
        return $this->hasMany(Invoice::class)->select('gross_price');
    }
}

当前查询代码

foreach (Client::find($id)->priceInvoices->toArray() as $item) {
    $prices[] = $item['gross_price'];
}

$transactions_for_prices = Transaction::whereIn('price', $prices)->get();

更优雅的实现方案

方案1:直接用子查询简化whereIn

不需要手动循环收集价格数组,直接将Invoice的关联查询作为子查询传入whereIn,代码更简洁:

$transactions = Transaction::whereIn(
    'price',
    Client::find($id)->invoices()->select('gross_price')
)->get();

如果需要先获取Client实例再复用,也可以这样写:

$client = Client::find($id);
$transactions = Transaction::whereIn('price', $client->invoices()->select('gross_price'))->get();

方案2:在Client模型中定义语义化查询方法

如果这个查询需要频繁使用,可以在Client模型中封装一个自定义方法,提升代码复用性和可读性:

class Client extends Model
{
    public function invoices()
    {
        return $this->hasMany(Invoice::class);
    }

    // 封装匹配交易记录的查询
    public function matchingTransactions()
    {
        return Transaction::whereIn('price', $this->invoices()->select('gross_price'));
    }
}

使用时只需一行代码:

$transactions = Client::find($id)->matchingTransactions()->get();

方案3:用whereExists优化性能(避免重复价格匹配)

如果Invoice中存在重复的gross_price,或者需要更高效的存在性匹配,使用whereExists可以避免处理重复值,同时优化查询性能:

$transactions = Transaction::whereExists(function ($query) use ($id) {
    $query->select(DB::raw(1))
          ->from('invoices')
          ->whereColumn('invoices.gross_price', 'transactions.price')
          ->where('invoices.client_id', $id);
})->get();

方案优势

  • 消除手动数组处理的冗余代码,逻辑更紧凑
  • 利用Laravel查询构造器的特性,代码语义化更强,可读性更高
  • 部分方案减少了查询次数或优化了查询执行效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 22:10:33