Php 在嵌套关系上添加where条件

Php 在嵌套关系上添加where条件,php,mysql,sql,laravel,eloquent,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'; 我在拉雷维尔的工作是: $this->builder->where('products.date', '>', '2019-12-01'); 很明显,它工作得很好。问题是,如果我将其替换为: $this->bui

我试图在模型的嵌套关系上添加where条件,如下所示:

SELECT *
FROM users u
INNER JOIN products p ON p.user_id = u.id
WHERE p.created_at > '2019-12-01';
我在拉雷维尔的工作是:

$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') 
所以在这种情况下,我的连接不适用于我的where条件,并且我得到了太多的结果

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

对于这种场景,使用with

$this->builder->with(['products'=>function ($query) {
  $query->where('date', '>', '2019-12-01');
}]);
有了它,你将获得用户的产品。但产品已过滤为日期>2019-12-01

你也可以用碳和日期来做


这是一种工作方式,因为我可以访问结果,但它没有作为where条件应用-它只提供我可以单独获得的过滤数据。此查询与第一个join查询相同。如果您查看查询日志,那么您可以找到上次执行的查询,请查看此链接。如果你想在关系上使用where条件,那么你需要遵循查询生成器而不是关系。根据这篇文章,原始查询将存在,并从产品中选择*,其中users.id=products.user\u id和date>'2019-12-01',我想你忘了发布一些代码。那么你是在$this->builder->where has之前加入产品的吗?你能发布你的代码关于$this->builder吗
$date =Carbon\Carbon::parse('2019-12-01')->format('Y-m-d');

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