2017-06-06 21 views
0

SQLクエリをlaravelクエリに変換する際に問題があります。私はusersmessagesという2つのテーブルに参加して、他のユーザーと会話しているユーザーを取得できるようにしたいと考えています。LARARELクエリで変換するJOIN、WHERE、AND句を含むSQLクエリ

データベース構造:

ユーザー: 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(); 
+0

- :

はこれを使用しますか? – Strawberry

+0

「他のユーザーと会話しているユーザー」とはどういう意味ですか? user_one列またはuser_two列のメッセージ表にあるすべてのユーザーが必要ですか? –

+0

@Strawberryそれはパラメータとして渡されています、 'function getMessage($ user_id)' @Autista_z他の言葉では、私は現在のユーザのすべての会話を表示したいだけです。 – Joseph

答えて

2

はUPDATE: 申し訳ありませんが、私のオリジナルの答えは安全な方法で変数を注入していませんでした。生のクエリに変数を安全に注入するためにこれを使用してください。

未処理ステートメントのSQLインジェクションセキュリティ。我々が設けられた第二引数を使用して、当社のMySQL データベースにすべての変数を渡すことを忘れない必要がある生のクエリで

あなたの場合、変数を注入したい場所に疑問符プレースホルダを置き、2番目の引数配列のプレースホルダと同じ順序で変数を配置します。

出典: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(

オリジナル回答:あなたが持っているよう あなたはjoin句でselect句を使用することはできません。定義さ@useridさ

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(); 
+0

ありがとうございます。できます。私はちょうど 'DB :: raw'を使って注入点について興味がありますが、それはuser_idを注射するのが安全でしょうか? – Joseph

+1

@JAlcあなたの意見を指摘してくれてありがとう、私は安全な方法で変数を注入していませんでした。私は私の答えを更新しました。見てください。 –

+0

ありがとうございます。 :) – Joseph

関連する問題