Laravel 5.8:显示雄辩的项目,基于时间戳排序

时间:2019-06-23 13:11:04

标签: php mysql laravel eloquent

我不确定如何称呼它,所以我将尽力解释它。

我有一个票务系统,我在其中显示所有评论。在不同部分中,显示相关信息,例如“支持者已更改”,“票证标题已更改”,“票证状态已更改”等等。

当前呈现的(未设置样式的)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?

2 个答案:

答案 0 :(得分:4)

据我了解,您拥有从多个模型中检索的数据。

所以您可以做的是,将信息合并到一个新的数组中:

例如,考虑有关票证历史记录的数据存储在名为:

的数组中
$arrTicketHistory;

并考虑有关票证更新的信息存储在名为:

的数组中
$arrTicketUpdates;

合并这两个数组,并将结果分配到另一个数组中,例如:

$arrDatesAndIDs;

现在尝试根据时间戳(即created_at)对数组$ arrDatesAndIDs进行排序。然后使用简单的for循环显示结果。

仅出于唯一性考虑,您可以在数组$ arrTicketUpdates和$ arrDatesAndIDs中添加自定义参数。它可以帮助您确定有关故障单的信息类型。

您可以使用php函数array函数array_msort()对多维数组进行排序。

答案 1 :(得分:2)

我刚刚发现了这个answer,但是这个问题有一个大问题:在最坏的情况下,它会覆盖一些对象不同的对象,这会导致集合中可能缺少对象。

来自Laravel documentation: Collections

  

merge方法将给定的数组或集合与原始集合合并。如果给定项目中的字符串键与原始集合中的字符串键相匹配,则给定项目的值将覆盖原始集合中的值。

由于这个原因,我不得不对此进行更新逻辑:

$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