Laravel 5.8: отображать красноречивые элементы, отсортированные по отметке времени

Я не уверен, как это называется, поэтому я объясню это как можно лучше.

У меня есть тикет-система, где я вывожу все комментарии в один раздел. В другом разделе я отображаю соответствующую информацию, такую ​​как «Сторонник изменен», «Название заявки изменено», «Статус заявки изменен» и так далее.

Текущий отображаемый (без стилей) HTML: https://jsfiddle.net/2afzxhd8/

Я хотел бы объединить эти два раздела в один, чтобы эта связанная информация отображалась между комментариями тикета. Все (комментарии + связанная информация) должно отображаться отсортированным по временной метке created_at.

Отображена новая цель (без стилей) HTML: https://jsfiddle.net/4osL9k0n/

Билетная система в моем случае имеет следующие красноречивые модели (и таблицы):

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class Tickets extends Model
{
    use SoftDeletes;

    protected $fillable = [
        'tracking_number', 'customer_id', 'category_id',
        'priority_id', 'subject', 'status_id', 'is_done',
        'supporter_id'
    ];

    protected $hidden = [
    ];

    protected $dates = ['deleted_at'];

    public function status() {
        return $this->belongsTo(TicketStatuses::class, 'status_id');
    }

    public function priority() {
        return $this->belongsTo(TicketPriorities::class, 'priority_id');
    }

    public function category() {
        return $this->belongsTo(TicketCategories::class, 'category_id');
    }

    public function supporter() {
        return $this->belongsTo(User::class, 'supporter_id');
    }

    public function operations() {
        return $this->hasMany(TicketOperations::class, 'ticket_id');
    }

    public function comments() {
        return $this->hasMany(TicketComments::class, 'ticket_id');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class TicketComments extends Model
{
    use SoftDeletes;

    protected $fillable = [
        'ticket_id', 'text', 'user_id', 'is_html',
        'email_reply', 'internal_only'
    ];

    protected $hidden = [
    ];

    protected $dates = ['deleted_at'];

    public function ticket() {
        return $this->belongsTo(Tickets::class, 'id', 'ticket_id');
    }

    public function user() {
        return $this->belongsTo(User::class, 'user_id');
    }
}
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;

class TicketOperations extends Model
{
    use SoftDeletes;

    protected $fillable = [
        'ticket_id', 'user_id', 'ticket_activity_id',
        'old_value', 'new_value'
    ];

    protected $hidden = [
    ];

    protected $dates = ['deleted_at'];

    public function ticket() {
        return $this->belongsTo(Tickets::class, 'ticket_id');
    }

    public function activity() {
        return $this->belongsTo(TicketActivities::class, 'ticket_activity_id');
    }

    public function user() {
        return $this->belongsTo(User::class, 'user_id');
    }
}

Пожалуйста, не беспокойтесь о CSS - в моем случае он стилизован. Просто здесь это не актуально.

Любая идея, как мне нужно обновить свое представление, чтобы иметь возможность создавать целевой HTML?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
6
0
414
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Насколько я понимаю, у вас есть данные, полученные из нескольких моделей.

Итак, что вы можете сделать, это объединить информацию в новый массив:

Например, представьте, что данные об истории заявок хранятся в массиве с именем:

$arrTicketHistory;

И учтите, что информация об обновлениях заявок хранится в массиве с именем:

$arrTicketUpdates;

Объедините эти два массива и присвойте результат другому массиву, скажем:

$arrDatesAndIDs;

Теперь попробуйте отсортировать массив $arrDatesAndIDs на основе метки времени, т. е. created_at. Затем отобразите результат с помощью простого цикла for.

Вы можете добавить пользовательский параметр в массивы $arrTicketUpdates и $arrDatesAndIDs просто для уникальности. Это может помочь вам определить, какой тип информации относится к билету.

Вы можете использовать функцию массива array_msort(), функцию php, для сортировки многомерного массива.

Ответ принят как подходящий

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

Из Документация Laravel: Коллекции:

The merge method merges the given array or collection with the original collection. If a string key in the given items matches a string key in the original collection, the given items's value will overwrite the value in the original collection.

Из-за этого мне пришлось обновить логику до этого:

$ticket = Tickets::where('tracking_number', '=', $request->tracking_number)->first();
$comments = $ticket->comments;
$operations = $ticket->operations;
$history_unsorted = new Collection();
$history_unsorted = $history_unsorted->merge($comments);
$history_unsorted = $history_unsorted->merge($operations);
$history = $history_unsorted->sortBy('created_at');

Это позволяет избежать перезаписи оригинальной коллекции.

При этом я могу просто перебрать $history:

@foreach($history as $history_item)
    @if ($history_item instanceof App\TicketOperations)
        <!-- Ticket Operation -->
    @else
        <!-- Ticket Comment (Text) -->
    @endif
@endforeach

Разве не должно работать следующее? $history = $ticket->comments->merge($ticket->operations)->sortBy('creat‌​ed_at');

Paul Spiegel 02.09.2019 18:44

Я пробовал это раньше, так как это было бы гораздо более простым решением, но проблема в том, что в худшем случае он перезаписывает некоторые объекты, а затем вы пропускаете некоторые объекты из коллекций. Вот почему я обновил этот комментарий немного другим решением. :) Я обновлю свой комментарий в ближайшие минуты с кратким объяснением.

user2966991 06.09.2019 21:14

Другие вопросы по теме