雄辩地查询与嵌套 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条件下返回集合

雄辩的关系 WHERE 语句不起作用

Laravel 雄辩的复杂搜索查询问题

查询数据库时嵌套 where 子句时遇到问题 - Laravel

为什么无法在graphql中过滤深层嵌套查询?

与模型属性的 where 条件的雄辩关系