gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:55:48 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com