雄辩地查询与嵌套 WHERE 的关系
Posted
技术标签:
【中文标题】雄辩地查询与嵌套 WHERE 的关系【英文标题】:Eloquent with query on relations with nested WHERE 【发布时间】:2021-05-29 06:49:02 【问题描述】:我正在努力使用 Eloquent 查询关系。
例如,我只寻找没有交易的客户约翰。
如何使用 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();
一点帮助会很棒。 谢谢
【问题讨论】:
您的查询看起来正确,那么您的问题是什么? 如果我正确理解了您的问题,您希望客户与名为 John 的客户没有交易?然后你需要使用操作符而不是=。所以你的 where 应该是 where('firstname, '', $inputFirst);对不起,如果这不是你要问的...... 您的问题仍然令人困惑,请您详细说明并添加模型定义 客户端模型关系public function transactions() return $this->hasMany(Transaction::class);
很抱歉造成混淆。我只寻找没有交易的客户约翰。现在,Eloquent 给我所有的交易
就像@adolfotcar 所说的将 where 子句更改为 '' 而不是 '='
【参考方案1】:
您的代码的问题在于您正在嵌套语句。你做 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,因为我不确定您是否希望获得它。但是,如果它打算在第二个选择内,则留在嵌套语句中,如果不留在外面。
【讨论】:
以上是关于雄辩地查询与嵌套 WHERE 的关系的主要内容,如果未能解决你的问题,请参考以下文章
与where子句查询的Eloquent嵌套关系在false条件下返回集合