如何使用Eloquent模型选择来转义查询


How to escape a query using an Eloquent model select?

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或更容易地手动向查询添加绑定:

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:正如下面的评论中所说,绑定被窃听了,方法的顺序很重要,所以上面的操作将按预期进行。