我不确定如何称呼它,所以我将尽力解释它。
我有一个票务系统,我在其中显示所有评论。在不同部分中,显示相关信息,例如“支持者已更改”,“票证标题已更改”,“票证状态已更改”等等。
当前呈现的(未设置样式的)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?
答案 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