Список только уникальные идентификаторы из 2 столбцов - PullRequest
0 голосов
/ 24 мая 2018

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

На данный момент все сообщения хранятся в 1 таблице.Таблица содержит «sender_id» и «receient_id», а также содержимое сообщения.

Чтобы получить список сообщений для отображения в папке входящих сообщений, я сейчас делаю это в контроллере:

    //Authenticate the user
    $user = auth()->user()->id;

    $messagesSent = Message::where('sender_id', $user)->get();
    $messagesReceived = Message::where('recipient_id', $user)->get();

    $messageThreads = $messagesReceived->merge($messagesSent);

В блейде, чтобы отобразить список потоков, которые я делаю:

            <ul class="list-group">

            @foreach ($messageThreads as $message)

            @if($message->user->id != $user)

            <li class="list-group-item"><a href="/messages/view/{{$message->user->id}}">{{$message->user->displayName}}</a></li>

            @else

            <li class="list-group-item"><a href="/messages/view/{{$message->recipient->id}}">{{$message->recipient->displayName}}</a></li>

            @endif

            @endforeach

        </ul>

Как и ожидалось, это просто отображает имена пользователей, от которых пользователь отправил сообщения или получил сообщения, а также ссылку на поток, но если у пользователя было несколько сообщений друг от друга,их имя будет отображаться несколько раз.

Пример того, как в данный момент выводится

  • Пользователь 1 Тема
  • Пользователь 1 Тема
  • Пользовательская тема 1
  • Пользовательская тема 2
  • Пользовательская тема 2
  • Пользовательская тема 3
  • Пользовательская тема 3

Как это должно выводить:

  • Пользователь 1 Тема
  • Пользователь 2 Тема
  • Пользователь 3 Тема

Я хочу убедиться, что имя и ссылка на тему указаны только один раз.

Я попытался использовать Different () и Unique (), однако, поскольку sender_id & receient_id - это отдельные столбцы, я все еще получаю повторяющиеся результаты.

Как бы я смог это преодолеть.

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 мая 2018
    $recipientIds = Message::select('recipient_id')->where('sender_id', $user)->get()->pluck('recipient_id');
$senderIds = Message::select('sender_id')->where('recipient_id', $user)->get()->pluck('sender_id');


$userIds = array_unique(array_merge($recipientIds , $senderIds ));
$users = User::whereIn('id', $userIds)->keyBy('id');

// view
@foreach($users as $user) 
    <li class="list-group-item"><a href="/messages/view/{{$user->id}}">{{$user->displayName}}
@endforeach

Кредит: https://laracasts.com/discuss/channels/laravel/list-only-unique-ids-from-2-columns

0 голосов
/ 24 мая 2018

Может быть так:

$user = auth()->user()->id;

$messageThreads = Message::where('sender_id', $user)->orWhere('recipient_id', $user)->get();

По сути, вы выполняли два одинаковых запроса в одной таблице, а затем объединяли результаты с помощью кода PHP.Вышеупомянутое решение (не проверено) объединяет два запроса в один, и, таким образом, объединение происходит на стороне БД.

В качестве альтернативы, вы все равно можете сделать это в PHP (здесь я предполагаю, что ваши записи сообщений имеют первичный ключ с именем "id"):

$messageThreads = $messageThreads->unique('id');

Но это может нарушить порядок сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...