php - 在嵌套关系上添加 where 条件

标签 php mysql sql laravel eloquent

我正在尝试在模型的嵌套关系上添加一个 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') 

所以在这种情况下,我的 JOIN 不适用于我的 where 条件,并且我得到了太多结果。

有没有一种方法可以使用 Eloquent 关系来应用嵌套 where 条件,就像我的第一个示例一样?

最佳答案

在这种情况下使用with

$this->builder->with(['products'=>function ($query) {
  $query->where('date', '>', '2019-12-01');
}]);

这样,您将获得拥有产品用户。但产品已过滤为日期> 2019-12-01

您也可以使用 carbonwhereDate 来完成此操作。

$date =Carbon\Carbon::parse('2019-12-01')->format('Y-m-d');

$this->builder->with(['products'=>function ($query) use($date) {
  $query->whereDate('date', '>', $date);
}]);

关于php - 在嵌套关系上添加 where 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59420080/

相关文章:

python - 如何根据所选条目路由到 Flask 中的 MySQL ID?

mysql - 从 DATETIME 中选择每年每个月的最后插入值

mysql - 通过减去一个值来更新列

sql - SQL Pivot 查询末尾的列总计

sql - Oracle 11g 将文本列拆分为行

php - SQL : Order two tables by Names

php - 从数据库中获取产品的特定数据

php - CodeIgniter:向 URL 添加参数

php - 组织包含 php 和 javascript 文件的代码

mysql - 在mysql中从右开始的3个字符后向字符串添加空格