SQL Query使用JOIN,WHERE和AND子句在Laravel查询中进行转换

时间:2017-06-06 05:26:00

标签: mysql laravel laravel-5.4

我在将SQL查询转换为laravel查询时遇到问题。我想加入两个表usersmessages,这样我就可以获得与其他用户进行对话的用户。

数据库结构:

用户: enter image description here

消息:

enter image description here

这是我的SQL查询,我得到了我想要的东西:

enter image description here

SELECT u.id, c.id, u.first_name, u.last_name FROM messages c, users u 
      WHERE (CASE WHEN c.user_one =  @USERID THEN c.user_two = u.ID WHEN c.user_two = @USERID THEN c.user_one= u.id END ) 
      AND ( c.user_one = @USERID OR c.user_two = @USERID ) Order by c.id DESC Limit 20

这是我的Laravel查询:

DB::table('messages')
   ->join('users', function($join) use ($user_id) {
        $join->select(DB::raw('CASE WHEN messages.user_one = ' . $user_id . ' THEN messages.user_two = ' . $user_id . 'WHEN messages.user_two = ' . $user_id . ' THEN messages.user_one = ' . $user_id));
        $join->on(function($query) use ($user_id)
        {
             $query->where('messages.user_one', '=', $user_id);
             $query->orWhere('messages.user_two', '=',$user_id);
        });       
   })
   ->select('users.*', 'messages.*')
   ->get();

1 个答案:

答案 0 :(得分:2)

<强>更新 抱歉,我的原始答案不是以安全的方式注入变量。请使用它来在原始查询中安全地注入变量。

原始语句中的SQL注入安全性。

  

在原始查询中,我们需要记住将所有变量传递给我们的mysql   数据库使用提供的第二个参数。

     

在您的情况下,您只需放置问号占位符,您希望在其中注入变量,然后将变量与您的第二个参数数组中的占位符放在一起。

来源:http://s4.jeffsbio.co.uk/laravel-5-query-builder-where-raw-2

更新了查询: -

DB::table('messages as m')
        ->join('users as u',function($join){
            $join->on('u.id','=','m.user_one')
            ->orOn('u.id','=','m.user_two'); 
        })
        ->where(function($query) use($user_id){
            $query->where('m.user_one','=',$user_id);
            $query->orWhere('m.user_two','=',$user_id);
        })
       ->where(function($query) use($user_id){
            $query->whereRaw(
                        'CASE WHEN m.user_one = ?'.
                        ' THEN m.user_two = u.id'. 
                        ' WHEN m.user_two = ?'.
                        ' THEN m.user_one = u.id END',[$user_id,$user_id]);
                    //here we passed the variables in exact order of their usage in query
       })
      ->select('u.id as user_id', 'm.id as messages_id','u.first_name','u.last_name')
      ->orderBy('m.id','DESC')
      ->limit('20')
      ->get(

原始答案: 您不能像select一样在join子句中使用DB::table('messages as m') ->join('users as u',function($join){ $join->on('u.id','=','m.user_one') ->orOn('u.id','=','m.user_two'); }) ->where(function($query) use($user_id){ $query->where('m.user_one','=',$user_id); $query->orWhere('m.user_two','=',$user_id); }) ->where(function($query) use($user_id){ $query->whereRaw(DB::raw( 'CASE WHEN m.user_one = '.$user_id. ' THEN m.user_two = u.id'. ' WHEN m.user_two = '.$user_id. ' THEN m.user_one = u.id END')); }) ->select('u.id as user_id', 'm.id as messages_id','u.first_name','u.last_name') ->orderBy('m.id','DESC') ->limit('20') ->get(); 子句。

使用: -

BREAK