假设我想显示带有 type="color"的完整奖项列表:
Awards Type 2013 Winner
====== ==== ===========
Blue Award color Tom
Red Award color
Green Award color Dan
为了实现这个结果,我可以像这样在 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();
如果你输出 Laravel 生成的 SQL,你会看到只有 WHERE 子句 被参数化并且 ON 子句 中的 $year 容易受到 sql 注入(inject)的攻击,如果我从不受信任的来源获取它。此外,查询的缓存潜力也会降低,因为 $year 会经常更改。 注意:如果您认为我只是将第二个左连接条件添加到查询的 WHERE,these are not the same .
关于如何使查询的 $year 部分参数化有什么想法吗?
最佳答案
这是一个奇怪的解决方法(不想扩展 Builder 和 JoinClause 类):
注意:这将中断与 ->
的查询链接,因此请注意下面分隔的 where
。
$query = DB::table('awards')
->leftJoin('winners', function($join)
{
$join->on('awards.id','=','winners.award_id');
$join->on('winners.year','=',DB::raw('?'));
}
->setBindings(array_merge($query->getBindings(),array($year)));
$query->where('awards.type','color');
$awards = $query->get();
更新:Taylor added joinWhere
, leftJoinWhere
...他说“如果你有一个函数 join 只需使用 ->where
和 ->orWhere
来自闭包中。”不过,我还没有尝试过。
关于php - Laravel Eloquent/Query Builder 中 LEFT JOIN 的 ON 子句中的参数化查询绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17733978/