2017-02-14 1 views
0

CaseОтношения запрос orWhere перезаписывает другому Wheres

обследования на основе несколько вопросов, которые возвращают x количества квартир, основанные на результатах.

Квартира может иметь статическую цену (price) или диапазон цен (price_min и price_max) - не все квартиры имеют статическую цену еще, чтобы они в настоящее время определяется ценовым диапазоном (например, 900-1000 в месяц аренды)

Проблема

Без orWhere([['price_min', '!=', null], ['price_max', '!=', null], ['price_min', '<', '900']] все работает отлично. Возвращаются только квартиры, которые проходят мимо условий where; хотя, когда условие orWhere добавляется all apartments with a price range (поэтому не price) не возвращаются, независимо от предыдущих условий, таких как floor или sun

Код

$selectedType = Type::where('slug', '=', $slug)->where('type', '=', 'studio')->with(['apartments' => function ($query) use ($request) { 
    $query->where('status', '!=', 'sold'); 

    if ($request->floor == 'low') { 
     $query->where('floor', '<', '5'); 
    } elseif ($request->floor == 'mid') { 
     $query->where('floor', '>', '1')->where('floor', '<', '6'); 
    } elseif ($request->floor == 'high') { 
     $query->where('floor', '>', '4'); 
    } 

    if ($request->sun == 'morning_sun') { 
     $query->where('sun', '=', 'morning'); 
    } elseif ($request->sun == 'evening_sun') { 
     $query->where('sun', '=', 'evening'); 
    } 

    if ($request->price == '1') { 
     $query->where('price', '<', '900')->orWhere([['price_min', '!=', null], ['price_max', '!=', null], ['price_min', '<', '900']]); 
    } elseif ($request->price == '2') { 
     $query->where('price', '<', '999')->orWhere([['price_min', '!=', null], ['price_max', '!=', null], ['price_min', '<', '999']]); 
    } 
}])->first(); 
+0

Лично (потому что я не знаю Laravel), я бы легче рассматривать MySQL в изоляции, а затем оставить его для вас, чтобы преобразовать этот запрос в Laravel – Strawberry

+0

Каким типом данных является 'price_min'? Убедитесь, что пустая строка отличается от нуля, поэтому, возможно, где должно быть «price_min», «! =», «». – Markinson

ответ

1

Вы должны сгруппировать илиWhere условия. Ниже следует сделать трюк:

if ($request->price == '1') { 
    $query->where(function($q) { 
     $q->where('price', '<', '900')->orWhere([['price_min', '!=', null], ['price_max', '!=', null], ['price_min', '<', '900']]); 
    }); 
} elseif ($request->price == '2') { 
    $query->where(function($q) { 
     $q->where('price', '<', '999')->orWhere([['price_min', '!=', null], ['price_max', '!=', null], ['price_min', '<', '999']]); 
    }); 
} 
Смежные вопросы