Eloquent 查询与嵌套 WHERE 的关系

Eloquent with query on relations with nested WHERE

我正在努力 Eloquent 查询关系。

比如我只找没有交易的客户John

如何使用 Eloquent 执行此操作?

客户端模型关系

public function transactions()
{
    return $this->hasMany(Transaction::class);
}
$results = Client::whereDoesntHave('transactions', function ($query) use ($inputFirst, $period) {
    $query->where('transactions.period_id', '=', $period->id)
          ->where('firstname', '=', $inputFirst);
    })
    ->orderBy('id', 'desc')
    ->get();

如果有一点帮助就好了。 谢谢

您的代码的问题在于您嵌套了语句。你做 Laravel 的方式是生成一个 SQL 像这样:

select * from `clients` where not exists 
(select * from `transactions` 
where `clients`.`id` = `transactions`.`client_id` 
and `name` = John)

但您要查找的实际 SQL 代码是:

select * from `clients` where not exists 
(select * from `transactions` 
where `clients`.`id` = `transactions`.`client_id`) 
and `name` = John)

为此,您的代码应该是:

$results = Client::whereDoesntHave('transactions')
                   ->where('firstname', '=', $inputFirst)
                   ->orderBy('id', 'desc')
                   ->get();

*我没有包括 transactions.period_id,因为我不确定您是否想要它。但是,如果它打算在第二个 select 内,则留在嵌套语句中,如果不在外面。