回覆,
我有以下查询:
$property =
Property::select(
DB::raw("title, lat, lng, (
3959 * acos(
cos( radians(:lat) ) *
cos( radians( lat ) ) *
cos( radians( lng ) - radians(:lng) ) +
sin( radians(:lat) ) *
sin( radians( lat ) )
)
) AS distance", ["lat" => $lat, "lng" => $lng, "lat" => $lat])
)
->having("distance", "<", $radius)
->orderBy("distance")
->take(20)
->get();
Run Code Online (Sandbox Code Playgroud)
它不起作用:Invalid parameter number: mixed named and positional parameters.
有没有人知道一个技巧或解决方法(我显然可以编写完整的查询,但更喜欢使用流利的构建器).
假设我想显示一个完整的奖项列表,其中type ="color":
Awards Type 2013 Winner
====== ==== ===========
Blue Award color Tom
Red Award color
Green Award color Dan
Run Code Online (Sandbox Code Playgroud)
为了达到这个结果,我可以在Laravel中查询如下:
$year = '2013';
$awards = DB::table('awards')
->leftJoin('winners', function($join) use ($year)
{
$join->on('awards.id','=','winners.award_id');
$join->on('winners.year','=',DB::raw("'".$year."'"));
}
->where('awards.type','color')
->get();
Run Code Online (Sandbox Code Playgroud)
如果输出Laravel生成的SQL,您将看到只有WHERE子句被参数化,并且如果从不受信任的源获取它,则ON子句中的$ year 容易受到sql注入的攻击.此外,查询的缓存潜力也会降低,因为$ year会经常更改.注意:如果您认为我只是将第二个左连接条件添加到查询的WHERE,则 这些不一样.
有关如何获取查询的$ year部分的任何想法参数化?