質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

0回答

431閲覧

Laravel,Pusher,ajaxを使ったチャット機能について

kk0055

総合スコア5

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

0クリップ

投稿2021/01/16 05:41

編集2021/01/17 07:19

#前提・実現したいこと

Laravel,Pusher,ajaxを使ったチャット機能を作りたいと思っています。
ログインユーザーがitemユーザー以外の場合は受信送信とも正しく入力、表示されるのですが、ログインユーザーがitemユーザーの場合メッセージが自分に送信され、送信者と受信者がログインユーザーになってしまいます。

itemを投稿したユーザーに正しくメッセージを送りたくいろいろ試してみたのですが方法がわからず教えていただきたいです。

##ソースコード
ルート

php

1 2Route::get('/chats/{receive}/send/{itemId}', [ChatsController::class, 'sendChat'])->name('chats.users'); 3Route::post('chat/send' , [ChatsController::class, 'store'])->name('chatSend');

blade

php

1 <div class="px-4 bg-white text-right sm:px-6"> 2 <a href="{{ route('chats.users',['receive' => $item->user->id ,'itemId'=> $item->id ] ) }}" 3 type="submit" >チャット </a></div>

コントローラー

php

1 public function sendChat(Request $request, $receive ,$itemId ) 2 { 3 4 // チャットの画面 5 $loginId = Auth::id(); 6 7 $param = [ 8 'send' => $loginId, 9 'receive' => $receive, 10 ]; 11 12 // 送信 / 受信のメッセージを取得する 13 $query = Message::where('send' , $loginId)->where('receive' , $receive); 14 $query->orWhere(function($query) use($loginId , $receive){ 15 $query->where('send' , $receive); 16 $query->where('receive' , $loginId); 17 18 }); 19 20 $messages = $query->get(); 21 $user = User::where('id', $param['receive'])->get(); 22 $item = Item::findOrFail($itemId); 23 24 return view('chats.sendChat' , compact('param' , 'messages','user','item')); 25 } 26 27 28 /** 29 * メッセージの保存をする 30 */ 31 public function store(Request $request) 32 { 33 34 // リクエストパラメータ取得 35 $insertParam = [ 36 'send' => $request->input('send'), 37 'receive' => $request->input('receive'), 38 'message' => $request->input('message'), 39 'user_id' => Auth::user()->id, 40 'item_id' => $request->input('item_id') 41 ]; 42 43 // メッセージデータ保存 44 try{ 45 Message::insert($insertParam); 46 }catch (\Exception $e){ 47 return false; 48 } 49 return true; 50 51 }

messagesテーブル

$table->id(); $table->foreignId('user_id')->constrained(); $table->foreignId('item_id')->constrained(); $table->bigInteger('send')->comment('送信者'); $table->bigInteger('receive')->comment('受信者'); $table->text('message'); $table->tinyInteger('is_read')->default(0); $table->timestamps();

chats.sendChat.blade.php

php

1@extends('layouts.app') 2 3@section('content') 4<div class="mt-4"> 5<div class="m-auto px-4 py-5 mt-2 max-w-xl bg-white rounded-lg " > 6 <div class="row"> 7 <div class="col-start-2 col-span-4 "> 8 9 10 </div> 11 </div> 12 13 {{-- チャットルーム --}} 14 <div id="room" class="justify-items-stretch"> 15 16 <h1 class="text-lg mb-2"> 17 <a class="no-underline hover:underline text-black" href="{{ route('users.items',[$user[0]->id]) }}"> 18 {{ $user[0]->name }}</a> さんへ 19 {{ $item->title }} について 20 21 </h1> 22 <hr> 23 24 25 26 @foreach($messages as $message) 27 28 {{-- 送信したメッセージ --}} 29 @if($message->send == \Illuminate\Support\Facades\Auth::id()) 30 <div class="flex items-end justify-end"> 31 <div class="send mr-2 bg-green-300 mx-1 my-1 px-1 rounded-lg" style="text-align: right"> 32 <p>{{$message->message}}</p> 33 </div> 34 35 </div> 36 <p class="text-xs " style="text-align: right">{{ $message->user->name }}</p> 37 @endif 38 39 {{-- 受信したメッセージ --}} 40 @if($message->receive == \Illuminate\Support\Facades\Auth::id()) 41 <div class="flex items-start justify-start"> 42 <div class="receive mr-2 bg-gray-300 mx-1 my-1 px-1 rounded-lg" style="text-align: left"> 43 <p >{{$message->message}}</p> 44 45 </div> 46 </div> 47 <p class="text-xs ">{{ $message->user->name }}</p> 48 @endif 49 50 51 @endforeach 52 53 </div> 54 55 <form > 56 @csrf 57 58 <textarea name="message" style="width:100%" class="mt-1 p-1 focus:outline-none focus:ring focus:border-blue-300 block w-full shadow-sm sm:text-sm border border-indigo-600 rounded-xl"></textarea> 59 60 <button type="button" id="btn_send" class="inline-flex justify-center py-2 px-8 mt-1 border border-transparent shadow-sm text-sm font-medium rounded-xl text-white bg-indigo-600 hover:bg-indigo-700 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-indigo-500 " style="float: right" > 61 <svg 62 class="w-4 h-4 transform rotate-45 -mt-px" 63 fill="none" 64 stroke="currentColor" 65 viewBox="0 0 24 24" 66 xmlns="http://www.w3.org/2000/svg" 67 > 68 <path 69 stroke-linecap="round" 70 stroke-linejoin="round" 71 stroke-width="2" 72 d="M12 19l9 2-9-18-9 18 9-2zm0 0v-8" 73 ></path> 74 </svg></button> 75 76 77 </form> 78 <input type="hidden" name="send" value="{{$param['send']}}"> 79 <input type="hidden" name="receive" value="{{$param['receive']}}"> 80 <input type="hidden" name="login" value="{{\Illuminate\Support\Facades\Auth::id()}}"> 81 <input type="hidden" name="item_id" value="{{$item->id}}"> 82 83</div> 84</div> 85@endsection 86

javascript

<script type="text/javascript"> var pusher = new Pusher('', { cluster : '', encrypted: true }); //購読するチャンネルを指定 var pusherChannel = pusher.subscribe('chat'); //イベントを受信したら、下記処理 pusherChannel.bind('chat_event', function(data) { let appendText; let login = $('input[name="login"]').val(); if(data.send === login){ appendText = '<div class="flex items-end justify-end"> <div class="send bg-green-300 mx-1 my-1 p-1 rounded-lg " style="text-align:right"><p>' + data.message + '</p></div></div> '; }else if(data.receive === login){ appendText = '<div class="receive bg-gray-300 w-3/4 mx-4 my-2 p-2 rounded-lg clearfix" style="text-align:left"><p>' + data.message + '</p></div> '; }else{ return false; } // メッセージを表示 $("#room").append(appendText); if(data.receive === login){ // ブラウザへプッシュ通知 Push.create("新着メッセージ", { body: data.message, timeout: 8000, onClick: function () { window.focus(); this.close(); } }) } }); $.ajaxSetup({ headers : { 'X-CSRF-TOKEN' : $('meta[name="csrf-token"]').attr('content'), }}); // メッセージ送信 $('#btn_send').on('click' , function(){ $.ajax({ type : 'POST', url : '/chat/send', data : { message : $('textarea[name="message"]').val(), send : $('input[name="send"]').val(), receive : $('input[name="receive"]').val(), item_id : $('input[name="item_id"]').val(), } }).done(function(result){ $('textarea[name="message"]').val(''); }).fail(function(result){ }); }); </script>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問