原生表达式
有时候你可能需要在查询中使用原生表达式。你可以使用 DB::raw 创建一个原生表达式:
$users = DB::table('users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '<>', 1)
->groupBy('status')
->get();
{提示} 原生表达式将会被当做字符串注入到查询中,因此你应该小心使用,避免创建 SQL 注入的漏洞。
原生方法
$sql = "select * from users"; //可以更复杂的SQL语句,比多表关联
$data = DB::table(DB::raw("($sql) as res"))->paginate(20);
可以使用以下方法代替 DB::raw,将原生表达式插入查询的各个部分。
selectRaw
selectRaw 方法可以代替 select(DB::raw(…))。该方法的第二个参数是可选项,值是一个绑定参数的数组:
$orders = DB::table('orders')
->selectRaw('price * ? as price_with_tax', [1.0825])
->get();
whereRaw / orWhereRaw
whereRaw 和 orWhereRaw 方法将原生的 where
注入到你的查询中。这两个方法的第二个参数还是可选项,值还是绑定参数的数组:
$orders = DB::table('orders')
->whereRaw('price > IF(state = "TX", ?, 100)', [200])
->get();
havingRaw / orHavingRaw
havingRaw 和 orHavingRaw 方法可以用于将原生字符串设置为 having 语句的值:
$orders = DB::table('orders')
->select('department', DB::raw('SUM(price) as total_sales'))
->groupBy('department')
->havingRaw('SUM(price) > ?', [2500])
->get();
orderByRaw
orderByRaw 方法可用于将原生字符串设置为 order by 子句的值:
$orders = DB::table('orders')
->orderByRaw('updated_at - created_at DESC')
->get();