基于关系的口才查询

问题描述 投票:0回答:1

我有2个模型,TransactionTrackingNumber

关系和字段是:

Transaction: hasMany TrackingNumber

Transaction fields: id | carrier
TrackingNumber fields: id | transaction_id

我正在尝试查询TrackingNumbers,但我只想返回运营商起步的地方。在这个意义上:


a)如果我使用紧急加载,它将返回所有跟踪号,无论托运人如何,并且仅根据where返回交易关系:

$collection = TrackingNumber::with(['transaction' => function($q) {
    $q->where('carrier', 'ups')
}])->get();

所以这不是我想要的。我想要的是$collection仅具有给定载波的TrackingNumbers。


b)如果我做这样的事情,结果是我想要的,但是效率很低((因为它进行2个查询并将数据存储在数组中;如果数组太大,则在whereIn上失败。 )

$transactionIds = Transaction::where('carrier', 'ups')->pluck('id');
$trackingNumbers = TrackingNumber::whereIn('id', $transactionIds)->get();

// The result is what I want but it is inefficient.

c)我也尝试过类似的方法,但是它不在乎where:/

\DB::table('tracking_numbers')
   ->join('transactions', 'tracking_numbers.transaction_id', '=', 'transactions.id')
   ->where('transactions.carrier', 'ups')
   ->get();

d)我不想使用whereHas(),因为它在处理大量数据时变得非常慢(我的表中有+ 1m行)


Laravel实现此目的的方法是什么?

laravel eloquent query-builder
1个回答
1
投票

使用whereHas应该会为您提供所需的结果:

TrackingNumber::whereHas('transaction', function ($query) {
    $query->where('carrier', 'ups');
})->get();

或者,尝试从c重构查询,如:

\DB::table('tracking_numbers')
   ->join('transactions', function ($join) {
        $join->on('tracking_numbers.transaction_id', '=', 'transactions.id')
             ->where('transactions.carrier', 'ups');
   })
   ->get();
© www.soinside.com 2019 - 2024. All rights reserved.