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();