当前位置: 首页 > 知识库问答 >
问题:

Laravel雄辩/查询生成器中LEFT JOIN的ON子句中的参数化查询绑定

蒋飞捷
2023-03-14

假设我想用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子句中的$年容易受到sql注入的攻击。此外,查询的缓存潜力也会降低,因为每年的美元会经常变化。注意:如果您认为我只是将第二个左连接条件添加到查询的WHERE中,这些条件是不一样的。

关于如何参数化查询的$年部分的任何想法?

共有3个答案

孔鸿哲
2023-03-14

这直接来自Laravel文档:

Laravel查询生成器始终使用PDO参数绑定来保护您的应用程序免受SQL注入攻击。不需要清除作为绑定传递的字符串。

你根本不需要对它进行消毒。应该没问题。如果您担心它,您可以使用验证程序类来验证它。

唐弘益
2023-03-14

目前可以使用$join-

$year = '2013';

$awards = DB::table('awards')
         ->leftJoin('winners', 
               function($join) use ($year)
               {
                    $join
                        ->on('awards.id','=','winners.award_id')
                        // "where" instead of "on":
                        ->where('winners.year', '=', $year);
               }
         ->where('awards.type','color')
         ->get();

南宫才英
2023-03-14

这里有一个奇怪的解决方法(不想扩展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();

更新:泰勒添加了joinWhereleftJoinWhere。。。他说,“如果你有一个函数连接,只需使用-

 类似资料:
  • Laravel Eloquent的save()方法实质上是执行查询生成器的工作吗? 查询生成器: 雄辩的: 如果这是真的,那么Eloquent的也是如此吗?我正在看Laravel的官方视频教程,我看到作者在控制器中使用了雄辩的和。这就是查询生成器和雄辩的区别吗?我们可以使用雄辩的内部控制器?

  • 我正在使用Laravel和它提供的雄辩的ORM,但我正在努力选择我需要的数据。我有两种型号 我该怎么做?

  • 假设我们正在使用Laravel的查询生成器: 我正在寻找一个等效的SQL: 当我必须键入大量select和WHERE(或者通常在select的列alias中包含别名,并且它在结果数组中使用)时,这将特别有用。如果没有任何表别名,我需要输入更多的内容,所有内容的可读性都会降低。在laravel文档中找不到答案,有什么想法吗?

  • 我有以下三种型号: 类别字段: 分类选项: 当我运行这个查询时,我得到了这个错误: SQLSTATE[42S22]:列未找到: 1054未知列'field ID'在'where子句'(SQL:选择*从其中=3)任何帮助请知道是什么问题!!?

  • 我使用laravel雄辩到CRUD数据。我的问题是,我不知道如何使用laravel雄辩的ORM进行UNION查询。你能帮我解决我的问题吗 这是我想要在laravel雄辩或查询生成器中实现的示例查询

  • 在我的应用程序中,我更新了从一对多到多对多的关系,我试图找出一种持久化关联功能的方法。 假设我有两个相关的表,例如狗和主人。如果我有一系列的主人,并且我正试图为这些主人获取一份狗的id列表,我应该如何雄辩地做到这一点? 这里也提出了类似的问题:https://laracasts.com/discuss/channels/laravel/getting-many-to-many-related-da