php - 在嵌套关系上添加 where 条件
问题描述
我正在尝试在模型的嵌套关系上添加 where 条件,如下所示:
SELECT *
FROM users u
INNER JOIN products p ON p.user_id = u.id
WHERE p.created_at > '2019-12-01';
我在 laravel 中所做的是:
$this->builder->where('products.date', '>', '2019-12-01');
它显然运作良好。问题是,如果我将其替换为:
$this->builder->whereHas('products', function ($query) {
$query->where('date', '>', '2019-12-01');
});
它不再按预期工作了。这是因为在第二种情况下,laravel 添加了以下查询:
and exists (SELECT * from products where users.id = products.user_id and date > '2019-12-01')
所以在这种情况下, myJOIN
不适用于我的 where 条件,我得到的结果太多。
有没有办法应用嵌套where
条件,使用雄辩的关系,就像我的第一个例子一样?
解决方案
用于with
这种场景。
$this->builder->with(['products'=>function ($query) {
$query->where('date', '>', '2019-12-01');
}]);
有了这个,你会users
得到products
。但products
已过滤为date > 2019-12-01
你可以用carbon
and来做whereDate
。
$date =Carbon\Carbon::parse('2019-12-01')->format('Y-m-d');
$this->builder->with(['products'=>function ($query) use($date) {
$query->whereDate('date', '>', $date);
}]);
推荐阅读
- mongodb - 最适合实时存储时间序列数据的解决方案
- oracle - INNER JOIN 两个表得到错误 SQL 语句没有正确结束
- asp.net - 我可以更改我的逻辑应用程序的 Aspnet 版本吗?
- scala - Akka - 如何检索对分片区域中实体的子角色的引用?
- linux - 使用 shell 脚本获取多行 XML 中的标记值
- php - 如何提供基于 2 个数组的文本框列表和文件输入文本框
- python - 如何从弹性搜索查询中获得准确的搜索结果
- r - 编写一个函数返回一个对应的值
- oracle - Oracle PL/SQL 为动态 SQL 交换 for 循环,协助语法更改
- java - AWS ECS 任务进入挂起状态