2014-01-19 69 views
8

我試圖使用Eloquent運行查詢 $ vars ['language']是小寫,但語言列不一定是小寫。我怎樣才能用雄辯這樣做搜索,但仍然有查詢Laravel Eloquent忽略外殼

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', 
    '&', '|', '^', '<<', '>>', 
); 

編輯:ilike是不區分大小寫like

+0

嘿什麼是ilike,它有什麼作用? –

+6

ilike是postgres不區分大小寫,如 –

+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加載! 'with'方法在哪裏?通過$ this-> contactInformation,您可以將所有聯繫信息加載到內存中,然後進行過濾。打擊內存而不是在數據庫級別進行操作始終是最糟糕的選擇:/ – dani24

+1

你是對的,我編輯了一些關於我的回答不正確的部分,以避免混淆其他讀者。 –