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内部.”我还没试过这个. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |