Здравствуйте, я занимаюсь разработкой блогового приложения и, как часть его, в настоящее время работаю над системой заявок, где пользователь создает заявку, а затем администраторы могут отвечать на эту заявку в интерфейсе администратора, где они могут видеть все созданные заявки. Я хочу, чтобы администраторы видели билеты, на которые они уже ответили, чтобы они могли легко перемещаться по системе, но у меня была проблема - когда я отправлял коллекцию всех билетов, на которые ответил администратор, один билет показывался несколько раз. Это потому, что я обрабатываю систему таким образом - у меня есть таблица сообщений, где в сообщении есть 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');
});