关于如何检查子表是不是具有某些多个值的雄辩或 SQL 方式

Posted

技术标签:

【中文标题】关于如何检查子表是不是具有某些多个值的雄辩或 SQL 方式【英文标题】:Eloquent or SQL way on how to check if child table has certain multiple values关于如何检查子表是否具有某些多个值的雄辩或 SQL 方式 【发布时间】:2019-06-15 14:37:01 【问题描述】:

根据给定的 ID 检查表是否具有值的 Eloquent 或 SQL 方法是什么?

客户表示例:

id   name    created_at
1   test_1   01/01/2019
2   test_2   01/24/2019
3   test_3   01/25/2019

样品采购表:

id   customer_id   status      created_at
1         2        paid        02/01/2019
2         2        paid        02/02/2019
3         2        unpaid      02/03/2019
4         2        cancelled   02/03/2019
5         3        paid        02/03/2019
6         1        paid        02/03/2019

我想要实现的是检查是否有未付款和取消状态的客户

目前我的代码是这样的:

Customers::with('purchases')->get();

但我希望它只从购买表中获取未付款和取消状态的客户

【问题讨论】:

请说明您是否需要最后状态或其他内容。 【参考方案1】:

使用 SQL,您需要 group by customer_id 并且 having 子句中的条件 count(distinct status) = 2 将为您提供您想要的客户:

select customer_id
from purchases
where status in ('unpaid', 'cancelled')
group by customer_id
having count(distinct status) = 2

如果您希望客户只有“未付款”和“已取消”状态而没有其他状态:

select customer_id
from purchases
group by customer_id
having 
  count(distinct status) = 2
  and 
  sum(case when status not in ('unpaid', 'cancelled') then 1 else 0 end) = 0

【讨论】:

使用“count(distinct...)”进行智能移动【参考方案2】:

解决了

doesntHave()

Laravel 雄辩的。

在客户的模型中,我放了:

public function unpaid_and_cancelled_purchases() 
   return $this->hasMany('App\Purchase', 'customer_id', 'id')
               ->whereIn('status', ['unpaid', 'cancelled']);

在我的控制器中,我是这样写的:

$customers = Customers::doesntHave('unpaid_and_cancelled_purchases')->get();

【讨论】:

【参考方案3】:
select name
from customers c
inner join purchases p on c.id = p.id
where c.id = CustomerId
and status in (cancelled, unpaid)
group by customer.id

【讨论】:

以上是关于关于如何检查子表是不是具有某些多个值的雄辩或 SQL 方式的主要内容,如果未能解决你的问题,请参考以下文章

如何检查用户是不是具有特定角色并因此允许某些操作?

如何优化这个雄辩的查询? (检查日期范围是不是尚未采用)

如果字符串中的值具有多个点值,如何检查双精度值是不是具有小数部分

如何检查对象是不是具有某些方法/属性?

如何检查 List<T> 元素是不是包含具有特定属性值的项目

如何在sql中排除具有某些值的记录