Laravel получение билетов, на которые ответил пользователь - PullRequest
1 голос
/ 24 января 2020

Здравствуйте, я занимаюсь разработкой блогового приложения и, как часть его, в настоящее время работаю над системой заявок, где пользователь создает заявку, а затем администраторы могут отвечать на эту заявку в интерфейсе администратора, где они могут видеть все созданные заявки. Я хочу, чтобы администраторы видели билеты, на которые они уже ответили, чтобы они могли легко перемещаться по системе, но у меня была проблема - когда я отправлял коллекцию всех билетов, на которые ответил администратор, один билет показывался несколько раз. Это потому, что я обрабатываю систему таким образом - у меня есть таблица сообщений, где в сообщении есть id, isResponde, ticket_id, user_id, ... таблица заявок и таблица заявок, в которой заявка имеет идентификатор, тип, isOpened и user_id, поэтому один билет владеет сообщениями, которые связаны с это через столбец ticket_id. Чтобы получить все тикеты, на которые администратор ответил, я сначала получаю все созданные им сообщения, которые имеют isResponse = true, поэтому я получаю только сообщения от тикетов, на которые он ответил

   $yourMessages = Message::all()->where('user_id','=',auth()->user()->id)->where('isResponse','=',true);

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

    $pom = 0;
    $yourTickets = [];
    foreach ($yourMessages as $message) {
        foreach ($yourTickets as $ticket){
            if ($ticket->id == $message->ticket_id){
                $pom++;
            }
        }

        if ($pom){
            continue;
        }

        $yourTickets = Ticket::all()->where('id','=', $message->ticket_id);

    }

Если администратор ответил только одним сообщением на один тикет, последний массив получает все тикеты, на которые он ответил, вместо первого с несколькими сообщениями

Схема для таблицы сообщений

Schema::create('messages', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->boolean('isSupportMessage')->default(false);
        $table->boolean('isResponse')->default(false);
        $table->unsignedBigInteger('user_id');
        $table->unsignedBigInteger('ticket_id')->nullable();
        $table->unsignedBigInteger('chat_id')->nullable();
        $table->text('text');
        $table->timestamps();

        $table->foreign('user_id')->references('id')->on('users');
        $table->foreign('ticket_id')->references('id')->on('tickets');
        $table->foreign('chat_id')->references('id')->on('chats');
    });

и для билета стол

Schema::create('tickets', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('type');
        $table->boolean('isOpened')->default(true);
        $table->unsignedBigInteger('user_id');
        $table->timestamps();

        $table->foreign('user_id')->references('id')->on('users');
    });

1 Ответ

0 голосов
/ 24 января 2020

Трудно понять, в чем именно заключается ваша проблема, но я считаю, что ваш код можно упростить до следующего:

$messages =  Message::all()->where('user_id','=',auth()->user()->id)->where('isResponse','=',true);

$tickets = Ticket::whereIn('id', $messages->pluck('ticket_id'))->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...