php – Laravel Eloquent / Query Builder中LEFT JOIN的ON子句中的参数化查询绑定

假设我想显示一个完整的奖项列表,其中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注入的攻击.此外,查询的缓存潜力也会降低,因为$year会经常更改.注意:如果您认为我只是将第二个左连接条件添加到查询的WHERE,these are not the same.

有关如何获取查询的$year部分的任何想法参数化?

最佳答案
这是一个奇怪的解决方法(不想扩展Builder和JoinClause类):
注意:这将打破查询链接 – >所以注意下面分开的地方.

$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 …他说“如果你有一个函数连接只是使用 – > where和 – >或者来自Closure内部.”我还没试过这个.

转载注明原文:php – Laravel Eloquent / Query Builder中LEFT JOIN的ON子句中的参数化查询绑定 - 代码日志