Próbuję dodać warunek gdzie w zagnieżdżonej relacji mojego modelu, coś takiego:
SELECT *
FROM users u
INNER JOIN products p ON p.user_id = u.id
WHERE p.created_at > '2019-12-01';
To, co robię w Laravel, to:
$this->builder->where('products.date', '>', '2019-12-01');
I oczywiście działa doskonale. Problem w tym, że jeśli zamienię go na:
$this->builder->whereHas('products', function ($query) {
$query->where('date', '>', '2019-12-01');
});
Nie działa już zgodnie z oczekiwaniami. Dzieje się tak, ponieważ w drugim przypadku laravel dodaje następujące zapytanie:
and exists (SELECT * from products where users.id = products.user_id and date > '2019-12-01')
Więc w tym przypadku mój JOIN
nie jest stosowany do mojego warunku gdzie i otrzymuję zbyt wiele wyników.
Czy istnieje sposób na zastosowanie zagnieżdżonego warunku where
przy użyciu elokwentnych relacji, który działałby tak, jak w moim pierwszym przykładzie?
1 odpowiedź
Użyj with
dla tego rodzaju scenariusza.
$this->builder->with(['products'=>function ($query) {
$query->where('date', '>', '2019-12-01');
}]);
Dzięki temu otrzymasz users
z products
. Ale products
przefiltrowano jako date > 2019-12-01
Możesz to zrobić również za pomocą carbon
i whereDate
.
$date =Carbon\Carbon::parse('2019-12-01')->format('Y-m-d');
$this->builder->with(['products'=>function ($query) use($date) {
$query->whereDate('date', '>', $date);
}]);
Podobne pytania
Nowe pytania
php
PHP to szeroko stosowany, wysokopoziomowy, dynamiczny, zorientowany obiektowo i interpretowany język skryptowy przeznaczony głównie do tworzenia stron WWW po stronie serwera. Używane w przypadku pytań dotyczących języka PHP.
and exists (SELECT * from products where users.id = products.user_id and date > '2019-12-01')
, myślę, że zapomniałeś zamieścić jakiś kod.join
products
przed$this->builder->whereHas
? czy możesz opublikować swój kod na temat$this->builder