首页 > 解决方案 > 在嵌套关系上添加 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条件,使用雄辩的关系,就像我的第一个例子一样?

标签: phpmysqlsqllaraveleloquent

解决方案


用于with这种场景。

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

有了这个,你会users得到products。但products已过滤为date > 2019-12-01

你可以用carbonand来做whereDate

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

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

推荐阅读