Php 如何使用雄辩的模型来逃避查询?

Php 如何使用雄辩的模型来逃避查询?,php,laravel,eloquent,Php,Laravel,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) a

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
正确转义?

使用

使用


您可以使用PDO或Easter手动将绑定添加到查询:

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();


编辑:如下面的注释所述,绑定存在缺陷,方法顺序也很重要,因此上述操作将按预期进行。

您可以使用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();


编辑:如下面的注释所述,绑定存在缺陷,方法顺序也很重要,因此上述操作将按预期进行。

这与
where
子句中使用的绑定冲突;它混淆了顺序。不,除非你改变了链的顺序,否则它不会混淆顺序。我不知道该告诉你什么,我正在查看它生成的laravel debugbar查询,我可以清楚地看到两个参数的替换是向后的。这是有意义的,因为
where
子句实际上位于
select
子句之后,尽管我先添加了它。注意,查询绑定是按照与链式方法相同的顺序添加到查询中的,所以不管它是在哪里结束还是其他。您可以使用Model::where(..)->select(…DB::raw())->addBinding()->where(..)。。。订单会完全一样。嗯,是的,你是100%正确。对不起,我犯了那个错误。我刚刚检查了其他链接的可能性,显然它被窃听了。我将更仔细地看一看,并找到一个解决方案。这与
where
子句中使用的绑定冲突;它混淆了顺序。不,除非你改变了链的顺序,否则它不会混淆顺序。我不知道该告诉你什么,我正在查看它生成的laravel debugbar查询,我可以清楚地看到两个参数的替换是向后的。这是有意义的,因为
where
子句实际上位于
select
子句之后,尽管我先添加了它。注意,查询绑定是按照与链式方法相同的顺序添加到查询中的,所以不管它是在哪里结束还是其他。您可以使用Model::where(..)->select(…DB::raw())->addBinding()->where(..)。。。订单会完全一样。嗯,是的,你是100%正确。对不起,我犯了那个错误。我刚刚检查了其他链接的可能性,显然它被窃听了。我会仔细看一看,然后找到解决办法。