2014-01-19 3 views
8

Я пытаюсь запустить запрос с использованием Eloquent $ vars ['language'] в нижнем регистре, но столбец языка не обязательно в нижнем регистре. Как я могу сделать это с помощью поиска красноречивый, но все еще имеют нижний регистр в запросеLaravel Eloquent Ignore Casing

Item::where('language', $vars['language']) 

Что я хочу сделать это, даже если я не могу найти где-нибудь, как это сделать

Item::where('LOWER(language)', $vars['language']) 

так что они оба в нижнем регистре, а затем я могу заставить их соответствовать.

+3

Использование DB: raw() для использования LOWER() – chris342423

ответ

14

Попробуйте использовать оператор ilike в вашем месте. Например

Item::where('language', 'ilike', $vars['language'])->get(); 

Все доступные операторы:

protected $operators = array(
    '=', '<', '>', '<=', '>=', '<>', '!=', 
    'like', 'not like', 'between', 'ilike', 
    '&', '|', '^', '<<', '>>', 
); 

Edit: ilike нечувствителен к регистру like.

+0

эй, что такое ilike и что он делает? –

+6

ilike is postgres case нечувствительный, как –

+0

большое спасибо, это все решает проблему !! –

6

По this post, БД-независимый способ решения этой проблемы было бы:

Item::whereRaw('LOWER(language) = ?', [$vars['language']])->get(); 
0

filter() метод сбора может быть полезно, если вы пытаетесь найти Laravel решение на основе:

// $this refers to an instance of an eloquent User Model 
$name = 'BiLbo baGGings';  
return $this->contactInformation->filter(function($value, $key) use($name) { 
    if(strtolower($value->name) == strtolower($name)) { 
     return $value; 
    } 
}); 
+1

Это не eagler-loading! где метод «с»? С $ this-> contactInformation вы загружаете в память ВСЕ информацию о контактах, а затем фильтруете. Нажатие на память вместо выполнения на уровне БД всегда является худшим вариантом:/ – dani24

+1

Вы правы, я отредактировал части, которые были неверны в моем ответе, чтобы не путать других читателей. –