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

标签 php laravel laravel-4 eloquent parameterized-query

假设我想显示带有 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/

相关文章:

php - 从现在开始约会 6 年后?

php - 如何创建向后循环以查找第一个匹配文件

php - 如何在 PHP 中正确格式化此 json 对象

php - Laravel 从数据库获取用户电话

php - 如何对远程关系表 Laravel 执行 where 查询?

laravel - 计算多对多关系?

javascript - Php 不从 json 发布数据,请

javascript - 通过 blade (laravel) 将 Prop (数组)传递给 vue.js

mysql - Laravel 根据种子数据迁移外键

php - 如何将查询构建器与 sum() 列和 groupBy 一起使用