Laravel Eloquent 查询关系 table 与 where 和 wherehas
Laravel Eloquent query with relationship table with where and wherehas
以下查询忽略 where('contact_id',$id)
导致 return 结果不属于此联系人。为什么?
Transaction::where('contact_id',$id)
->with('allocations')
->whereHas("allocations",function ($query){
$query->select('transaction_id')
->havingRaw('transactions.amount > sum(amount)')
->groupBy('transaction_id');
})
->orDoesntHave("allocations")
->get();
如果我删除 whereHas 部分,它会返回正确的结果。但我需要 whereHas 部分。
->whereHas("allocations",function ($query){
$query->select('transaction_id')
->havingRaw('transactions.amount > sum(amount)')
->groupBy('transaction_id');
})
->orDoesntHave("allocations")
基本上,我正在尝试查询交易金额大于该交易的分配总和(交易 hasMany 分配)的交易。
我会说问题出在这一行
->orDoesntHave("allocations")
因为您的条件逻辑看起来像这样(在 SQL 中)
WHERE contact_id = ... AND count_subquery_allocations > 0 OR count_have_no_allocations = 0
如您所见,即使 contact_id = ...
为假,OR
“使条件为真”...您可能想要这样:
Transaction::where('contact_id',$id)
->where(function($query){
return $query->whereHas("allocations",function ($query){
return $query->select('transaction_id')
->havingRaw('transactions.amount > sum(amount)')
->groupBy('transaction_id');
})
->orDoesntHave("allocations");
})
->with('allocations')
->get();
以下查询忽略 where('contact_id',$id)
导致 return 结果不属于此联系人。为什么?
Transaction::where('contact_id',$id)
->with('allocations')
->whereHas("allocations",function ($query){
$query->select('transaction_id')
->havingRaw('transactions.amount > sum(amount)')
->groupBy('transaction_id');
})
->orDoesntHave("allocations")
->get();
如果我删除 whereHas 部分,它会返回正确的结果。但我需要 whereHas 部分。
->whereHas("allocations",function ($query){
$query->select('transaction_id')
->havingRaw('transactions.amount > sum(amount)')
->groupBy('transaction_id');
})
->orDoesntHave("allocations")
基本上,我正在尝试查询交易金额大于该交易的分配总和(交易 hasMany 分配)的交易。
我会说问题出在这一行
->orDoesntHave("allocations")
因为您的条件逻辑看起来像这样(在 SQL 中)
WHERE contact_id = ... AND count_subquery_allocations > 0 OR count_have_no_allocations = 0
如您所见,即使 contact_id = ...
为假,OR
“使条件为真”...您可能想要这样:
Transaction::where('contact_id',$id)
->where(function($query){
return $query->whereHas("allocations",function ($query){
return $query->select('transaction_id')
->havingRaw('transactions.amount > sum(amount)')
->groupBy('transaction_id');
})
->orDoesntHave("allocations");
})
->with('allocations')
->get();