【问题标题】:Eloquent with query on relations with nested WHERE雄辩地查询与嵌套 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 子句更改为 '' 而不是 '='

标签: laravel eloquent laravel-6


【解决方案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,因为我不确定您是否希望获得它。但是,如果它打算在第二个选择内,则留在嵌套语句中,如果不留在外面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2019-06-27
    • 2016-09-18
    相关资源
    最近更新 更多