我正在尝试在模型的嵌套关系上添加一个 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
您也可以使用 carbon
和 whereDate
来完成此操作。
$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/