加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

php – Laravel Eloquent / Query Builder中LEFT JOIN的ON子句中

发布时间:2020-12-14 19:43:27 所属栏目:大数据 来源:网络整理
导读:假设我想显示一个完整的奖项列表,其中type =“color”: Awards Type 2013 Winner====== ==== ===========Blue Award color TomRed Award colorGreen Award color Dan 为了达到这个结果,我可以在Laravel中查询如下: $year = '2013';$awards = DB::table('aw
假设我想显示一个完整的奖项列表,其中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内部.”我还没试过这个.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读