Как избежать запроса с использованием модели Eloquent?

DB::select принимает второй параметр, как описано здесь , но Eloquent::select – нет.

Вот мой запрос:

 Feature::where('company_id', Auth::user()->company_id) ->select('id','name',DB::raw("exists(select * from vehicle_features vf where vf.vehicle_id=$id and vf.feature_id=feature.id) as `checked`")) ->orderBy('name')->get(), 

Как я могу обеспечить, чтобы $id был экранирован правильно?

Используйте DB::getPdo()->quote($id) .

 ->select( 'id', 'name', DB::raw( "exists(select * from vehicle_features vf where vf.vehicle_id=" . DB::getPdo()->quote($id) . " and vf.feature_id=feature.id) as `checked`" ) ) 

Вы можете использовать PDO или проще вручную добавить привязку к Query:

 Feature::select( 'id', 'name', // replace $id here DB::raw("exists(select * from vehicle_features vf where vf.vehicle_id=? and vf.feature_id=feature.id) as `checked`")) // and add this part ->addBinding($id) ->where('company_id', Auth::user()->company_id) ->orderBy('name')->get(); 

edit: как указано в комментариях ниже, привязки прослушиваются, и порядок методов имеет значение, поэтому приведенное выше будет работать так, как ожидалось.