#php #mysql #laravel #eloquent
#php #mysql #laravel #красноречивый
Вопрос:
В моей таблице продуктов у меня есть 2 столбца: price
и discounted_price
, в котором discounted_price
значение null большую часть времени, если для этого продукта нет рекламы:
---- -------------------- ------- ------------------
| id | name | price | discounted_price |
---- -------------------- ------- ------------------
| 1 | test 1 | 79.00 | null |
| 2 | test 2 | 50.00 | 45.00 |
---- -------------------- ------- ------------------
Продукт с идентификатором 2
сейчас находится в продвижении и имеет discounted_price
.
Теперь я хочу запросить продукты, чтобы получить продукты дешевле 50, но в моем запросе мне нужно проверить, discounted_price
есть null
ли это, затем заглянуть price
, в противном случае заглянуть discounted_price
. То, что сказал Google, использует:
$products = Product::where('coalesce(price, discounted_price) <= 50);
Но это не работает:(
Комментарии:
1. если вам нужно получить дешевле 50 и
null
также, тогда подзапроса недостаточно?2. В вашем примере вы не закрываете строку,
'
отсутствует в конце после50
3. @Pepper это просто опечатка здесь
Ответ №1:
Альтернативно, вы можете использовать подзапрос, например, так :
$q = 50;
$product = Product::where(function($query) use($q) {
$query->where('discounted_price', '<=', $q)
->orWhere('price', '<=', $q)
})
->get();
Комментарии:
1. Я принял ваш ответ, потому что он работает, но все же я не знаю, почему
select * from products where coalesce(price, discounted_price) <= 50
не работает
Ответ №2:
вы можете использовать whereRaw
вместо where
или where(DB::raw('coalesce(price, discounted_price') <= 50))
также будьте осторожны, чтобы закрыть свой where по '
символу
Ответ №3:
я рекомендую использовать where с clouser следующим образом:
$products = Product::where(function ($query)
{
$query->where('discounted_price',null)->where('price','<=',50);
})->orWhere('discounted_price','<=',50)->get();
Комментарии:
1. Как насчет OrderBy?