При красноречивом поиске по 2 полям - PullRequest
0 голосов
/ 08 июня 2018

Есть ли способ в 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>

и работает как Я нуждаюсь.Если есть способ установить "()" в моей области?

1 Ответ

0 голосов
/ 08 июня 2018

Используйте следующее ограничение:

$price = 10;
$builder->where(function($query) use ($price) {
  $query->whereNotNull('sale_price')->where('sale_price', '>', $price);
  $query->orWhere('retail_price', '>', $price);
});

Это добавит к вашему запросу следующее:

AND (sale_price IS NOT NULL and sale_price > 10 OR retail_price > 10)

Что важно, вы найдете эти дополнительные ограничения, заключенные в скобки, которые будутПозвольте вам избежать ситуации, когда другие ограничения игнорируются из-за ИЛИ .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...