我有2个模型,Transaction
,TrackingNumber
。
关系和字段是:
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实现此目的的方法是什么?
使用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();