【问题标题】:Laravel remove quotes from variable in database queryLaravel 从数据库查询中的变量中删除引号
【发布时间】:2018-02-17 18:51:43
【问题描述】:

我正在使用 Laravel (5.4) 构建一个 RAW 数据库查询,但我遇到了一个问题,即 laravel 在 SQL 输出中为连接中的变量添加引号......结果是 mysql 认为变量...例如将输出到 1 或数字是一列并输出错误“在 ON 子句中找不到列 '1'

问题 SQL 子句:

->join('event_jury_sub_detail', function($join) use($userid) { $join->on('event_jury_sub_detail.evtpartsub_id', '=', 'event_partsubmissions.id') ->on('event_jury_sub_detail.authoruser_id','=',$userid);

问题:$userid 得到引号...并变成“and event_jury_sub_detail.authoruser_id = 1” - Laravel 将其视为要查找的列并失败。

如果引号被删除,它可以正常工作......如何解决这个问题?

完整查询

$tbl_return = DB::table('event_partsubmissions')
            ->select(DB::raw('event_partsubmissions.*,
                                users.usr_firstnames,
                                users.usr_surnames,
                                users.email,
                                users.usr_nationality,
                                users.usr_country,
                                event_jury_sub_detail.id as evtjurysubdetid,
                                event_jury_sub_detail.evtjurysubdet_pointsawarded,
                                event_jury_sub_detail.evtjurysubdet_notes,
                                event_jury_sub_detail.evtjurysubdet_randomkey
                            '))
            ->join('event_participation', 'event_partsubmissions.evtpartsub_evtpartid', '=', 'event_participation.id')                
            ->join('users', 'evtpart_userid', '=', 'users.id')
            ->join('event_jury_sub_detail', function($join) use($userid)
                    {
                    $join->on('event_jury_sub_detail.evtpartsub_id', '=', 'event_partsubmissions.id')
                        ->on('event_jury_sub_detail.authoruser_id','=',$userid);                        
                    })
            ->where('event_partsubmissions.evtpartsub_evtid', '=', $id)
            ->where('event_partsubmissions.evtpartsub_enabled', '>=', $partlevel)
            ->where('event_participation.evtpart_enabled', '>=', 1) 
            ->where('event_participation.evtpart_level', '>=', 100)  
            ->where('users.usr_enabled', '>=', 1)  
            ->get();

【问题讨论】:

    标签: php sql laravel join


    【解决方案1】:

    使用 DB::raw()

    ->on(DB::raw("event_jury_sub_detail.authoruser_id = '".$userid."'"))

    【讨论】:

      【解决方案2】:

      您可以尝试使用别名进行表连接:

      ->join('event_jury_sub_detail as ejsd', ...
      

      并在以下地方使用别名:

      ->$join->on('ejsd.evtpartsub_id', '=', 'event_partsubmissions.id')
      

      对于连接条件中的标量参数,您可以使用 DB wrapper,例如 DB::raw($userid):

      ->on('ejsd.authoruser_id','=',DB::raw($userid));
      

      【讨论】:

      • 这是一个很好的建议,但不幸的是并不能解决这个特殊问题。应用这些别名仍会导致错误“ SQLSTATE[42S22]: Column not found: 1054 Unknown column '1' in 'on clause' (SQL: select event_partsubmissions.*
      • 所以基本上这里发生的事情是连接子句中的 $userid 变量变为 authoruser_id = 1 并且 mysql 认为 '1' 是要查找的列而导致查询失败。跨度>
      • @stoneferry 您可以毫无问题地将->on('event_jury_sub_detail.authoruser_id','=',$userid); 部分(或带有别名的->on('ejsd.authoruser_id','=',$userid);)移动到where 部分,试试看!结果可能看起来像:->where('ejsd.authoruser_id','=',$userid);
      • 再次感谢您的建议,实际上我无法进行此操作,因为有时该行将不存在于 ejsd 表中,如果我将其移至“Where”子句,我将根本没有返回结果集,我不想要的东西。
      • @stoneferry 然后您可以尝试将DB::raw($userid) 作为参数传递给 on() 方法而不是$userId。这是这种情况的最后一种变体)
      猜你喜欢
      • 1970-01-01
      • 2022-07-03
      • 2010-12-29
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      相关资源
      最近更新 更多