在使用laravel開發過程中,開發者經常會遇到如下的SQL,在laravel中如何正確表達類似這樣的SQL:
SELECT * FROM `medias` WHERE (`prov_id` = 410000 OR `city_id` = 410102) AND (`scence_id` = 101 OR `parent_id` = 10);
很多laravel開發者可能會選擇whereRaw()這樣的方法把原生SQL包裹起來簡單省事:
Media::whereRaw('(`prov_id` = 410000 OR `city_id` = 410102) AND (`scence_id` = 101 OR `parent_id` = 10)');
whereRaw()方式使用不當會有SQL注入的風險,這裡,laravel提供一種優雅方式來表達這樣的SQL場景,那就是使用閉包函數把括弧內的表達式包裹起來,比如,類似上面的SQL可以表達為:
Media::where(function($query){
return $query->where('prov_id',410000)->orWhere('city_id',410102);
})->where(function($query){
return $query->where('scence_id',101)->orWhere('parent_id',10);
});
這樣的代碼,閱讀起來更容易理解,並且也避免了SQL注入的風險。