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%正确。对不起,我犯了那个错误。我刚刚检查了其他链接的可能性,显然它被窃听了。我会仔细看一看,然后找到解决办法。