2016-09-19 128 views
1

這裏是我的聊天記錄表如何這個SQL查詢轉換爲laravel雄辯或查詢生成器

Schema::create('chats', function (Blueprint $table) { 
       $table->bigIncrements('id'); 
       $table->enum('block', ['no', 'yes'])->default('no'); 
       $table->timestamps(); 

       $table->bigInteger('user_one')->unsigned(); 
       $table->foreign('user_one') 
        ->references('id') 
        ->on('users') 
        ->onDelete('cascade'); 

       $table->bigInteger('user_two')->unsigned(); 
       $table->foreign('user_two') 
        ->references('id') 
        ->on('users') 
        ->onDelete('cascade'); 
      }); 

表結構這裏是一個我chat_messages表

Schema::create('chat_messages', function (Blueprint $table) { 
       $table->increments('id'); 
       $table->enum('viewed', ['no', 'yes'])->default('no'); 
       $table->string('msg', 1000); 
       $table->timestamps(); 

       $table->bigInteger('chat_id')->unsigned(); 
       $table->foreign('chat_id') 
         ->references('id') 
         ->on('chats') 
         ->onDelete('cascade'); 

       $table->bigInteger('user_id')->unsigned(); 
       $table->foreign('user_id') 
        ->references('id') 
        ->on('users') 
        ->onDelete('cascade'); 
      }); 

我現在的問題是我想運行這個查詢哪些在phpmyadmin工作正常

SELECT U.id,C.id,U.name,U.email FROM users as U, chats as C, chat_messages as M WHERE CASE WHEN C.user_one = '2' THEN C.user_two = U.id WHEN C.user_two = '2' THEN C.user_one= U.id END AND C.id = M.chat_id AND (C.user_one ='2' OR C.user_two ='2') ORDER BY C.id DESC 

這是我的版本的上述que使用Laravel查詢生成器RY這似乎並沒有工作

$authUser = Auth::user()->id; 
    $chatList = DB::select(DB::raw('U.id, C.id, U.name')) 
       ->from(DB::raw('users as U, chats as C, chat_messages as M')) 
       ->where(DB::raw('CASE 
        WHEN C.user_one = '.Auth::user()->id.' 
        THEN C.user_two = U.id 
        WHEN C.user_two = '.Auth::user()->id.' 
        THEN C.user_one= U.id END')) 
       ->where('C.id', '=', 'M.chat_id') 
       ->where(function($query) use ($authUser) { 
        $query->where('C.user_one', '=', $authUser) 
          ->orWhere('C.user_two', '=', $authUser); 
       }) 
       ->orderBy('C.id', 'desc') 
       ->get(); 

出來把這個錯誤

SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'U.id, C.id, U.name' at line 1 (SQL: U.id, C.id, U.name) 

,我已經試了很多方法,但似乎並沒有工作...請我需要你的幫助來弄清楚如何與此去...感謝

+0

使用加入,而不是 – Beginner

回答

0

這裏是

$authUser = Auth::user()->id; 
    $chatList = DB::table(DB::raw('users as U, chats as C, chat_messages as M')) 
     ->select(DB::raw('U.id, C.id, U.name, U.email')) 
     ->whereRaw('CASE 
       WHEN C.user_one = '.Auth::user()->id.' 
       THEN C.user_two = U.id 
       WHEN C.user_two = '.Auth::user()->id.' 
       THEN C.user_one= U.id END 
       AND C.id = M.chat_id AND 
       (C.user_one = '.$authUser.' OR C.user_two = '.$authUser.')') 
     ->orderBy('C.id', 'DESC') 
     ->get(); 
+0

這工作,但每行返回兩次... – PappyCrack

+0

它是否具有與您上面編寫的查詢相同的結果? – Beginner

+0

我的意思是這個查詢SELECT U.id,C.id,U.name,U.email FROM users as U,chats as C,chat_messages as M WHERE CASE WHEN C.user_one ='2'THEN C.user_two = U .id WHEN C.user_two ='2'THEN C.user_one = U.id END AND C.id = M.chat_id AND(C.user_one ='2'或C.user_two ='2')ORDER BY C.id DESC – Beginner