Есть ли способ в Laravel 5.6 / MySQL 5.7 с eloquent для поиска с условием:
- нужно проверить, установлена ли sale_price, тогда искать в sale_price еще в retail_price
Использовал ли я условие вроде:
\DB::raw( ‘ isNull( sale_price, retail_price ) > 10’ )
и как изменить поиск выше, если и sale_price, и retail_price имеют значение null?
Или есть лучшее решение?
ИЗМЕНЕНО:
Я реализовал это как область действия:
public function scopeGetByDoublePrice($query, $price_from= null, $price_to= null)
{
// need to check if sale_price is set then search in sale_price else in retail_price
if ( empty($price_from) and empty($price_to) ) return $query;
if ( !empty($price_from) ) { // $price_from is set
$query->whereNotNull('sale_price')->where('sale_price', '>=', $price_from);
$query->orWhere('retail_price', '>=', $price_from);
} // if (!empty($price_from) ) { // $price_from is set
if ( !empty($price_to) ) { // $price_to is set
$query->whereNotNull('sale_price')->where('sale_price', '<=', $price_to);
$query->orWhere('retail_price', '<=', $price_to);
} // if (!empty($price_to) ) { // $price_to is set
return $query;
}
, но при настройке 2 значений 31 и 33 я получил другой ожидаемый результат:
https://imgur.com/a/AYTJAJn Я ожидал, что только первая строка будет в наборе результатов!
В sql-редакторе я установил "()" вручную, как:
SELECT sale_price
, retail_price
ОТ articles
ЛЕВЫЙ СОЕДИНЕНИЕ брендов AS b на b.id = Articles.brand_id ВЛЕВО СОЕДИНЕНИЯ article_inventories КАК ai на ai.article_id = article.id ГДЕ ((* sale_price
не является нулевым И sale_price
> = '31'ИЛИ retail_price
> = '31') И (sale_price
не является нулевым И sale_price
<= '33' ИЛИ <code>retail_price <= '33')) </p>
и работает как Я нуждаюсь.Если есть способ установить "()" в моей области?