Как отображать сообщения, полученные от других пользователей, используя Laravel - PullRequest
0 голосов
/ 26 апреля 2018

Я работаю над функцией обмена сообщениями на моем веб-сайте между двумя пользователями, и мне удалось заставить систему обмена сообщениями работать нормально. Но у меня есть небольшая проблема, которую я не могу найти решение. Я хочу, чтобы иметь возможность показать, список всех сообщений, полученных от других пользователей, когда пользователь нажимает на этот маршрут / разговоры. Но прямо сейчас он отображает список всех пользователей в таблице пользователей, когда я нажимаю на маршрут / разговоры, которые мне не нужны.

Вот мои маршруты в сети

Route::get('/conversations', 'ConversationsController@index')->name('conversations');

Route::get('/conversations/{user}', 'ConversationsController@show')->name('conversations.show');

Route::post('/conversations/{user}', 'ConversationsController@store');

Вот мой список маршрутов разговоров для индекса

<div class="contact-edit" id="ci">
 <h3>MEssages</h3>

   @include('conversations.users', ['users'=>$users, 'unread'=>$unread])

</div>

Вот разговор. Пользователи

<div class="col-md-3">

        <div class="list-group">


            @foreach($users as $user)
            <a class = "list-group-item d-flex justify-content-between align-items-center" href="{{route('conversations.show', $user->id)}}">
                {{ $user->name }} 

                @if(isset($unread[$user->id]))
                    <span class="badge-pill badge-primary">{{$unread[$user->id]}}</span>
                @endif

            </a>

            @endforeach


        </div>

Вот мой маршрут, открывающий вкладку разговоров

<a href="{{ route('conversations.show', ['id'=>$profiledetail->id]) }}">Ecrire un message</a>

Вот мой контроллер разговора

класс ConversationsController расширяет контроллер {

private $r;

private $auth;


public function __construct(ConversationRepository $conversationRepository, AuthManager $auth)
{
    $this->r = $conversationRepository;
    $this->middleware('auth');
    $this->auth = $auth;
}



public function index (User $user){

    $me = Auth::user(); 

    //dd(Auth::user());
    return view('conversations/index', [
        'users'=>$this->r->getConversations(Auth::user()->id),
        'unread' => $this->r->unreadCount(Auth::user()->id)

    ]);
}


public function show (User $user){

 $me = Auth::user();   
 $messages = $this->r->getMessagesFor($me->id, $user->id)->paginate(5);
 $unread = $this->r->unreadCount($me->id);

 if (isset($unread[$user->id])) {
     $this->r->readAllFrom($user->id, $me->id);
     unset($unread[$user->id]);
 }

    return view('conversations/show', [
        'users'=>$this->r->getConversations($me->id),
        'user'=>$user,
        'messages'=>$messages,
        'unread' => $unread 
    ]);


}


public function store (User $user, StoreMessageRequest $request){

    $message = $this->r->createMessage(

        $request->get('content'), 
        Auth::user()->id,
        $user->id
    );

    $user->notify(new MessageReceived($message));

    return redirect(route('conversations.show', ['id'=>$user->id]));

}
* *} Тысяча двадцать-один

А вот мой репозиторий

class ConversationRepository 
   {

private $user;
private $message;

public function __construct(User $user, Message $message)
{
    $this->user = $user;
    $this->message = $message;
}

public function getConversations(int $userId)
{
    $conversations =  $this->user->newQuery()
        ->select('name','surname','photo','id')
        ->where('id', '!=', $userId)
        ->whereType('jobber')
        ->get();

    return $conversations;

}

public function createMessage(string $content, int $from, int $to)
{
    return $this->message->newQuery()->create([

        'content'=>$content,
        'from_id'=>$from,
        'to_id'=>$to,
        'created_at'=>\Carbon\Carbon::now()
    ]);

}

public function getMessagesFor(int $from, int $to) : Builder
{
    return $this->message->newQuery()

        ->whereRaw("((from_id = $from AND to_id = $to )OR(from_id = $to AND to_id = $from))")

        ->orderBy('created_at', 'DESC')

        ->with([

            'from'=> function ($query){ return $query->select('name', 'id');}

        ]);


}


//Recupere le nombre de message non lu pour chaque conversation

public function unreadCount (int $userId)
{

    return $this->message->newQuery()
        ->where('to_id', $userId)
        ->groupBy('from_id')
        ->selectRaw('from_id, COUNT(id) as count')
        ->whereRaw('read_at IS NULL')
        ->get()
        ->pluck('count', 'from_id');
}

Это моя пользовательская модель

 public function messages()
{
    return $this->hasMany('App\Message', 'from_id', 'to_id', 'content');
}

Это модель сообщения

  public function user() 
{
    return $this->belongsTo('App\User');
}

Любая помощь будет приветствоваться

1 Ответ

0 голосов
/ 28 апреля 2018

Я не уверен, что понимаю, что вы хотите сделать, но вот возможное решение, если вы хотите получить все сообщения, которые вам нужны.

В вашем хранилище:

$this->message->where('to_id',Auth::user()->id)->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...