Laravel不同的对象合并和排序

时间:2016-09-02 06:45:58

标签: php laravel sorting merge

我有两个不同的对象,在DB中有不同的列。由于我需要在时间轴上显示这两个对象,我想合并它们并按日期排序。 Date列的调用方式不一样,所以我在for循环中添加它。

public function index()
{
    $users = array_slice(WPUser::orderBy('id', 'desc')->get()->toArray(), 0, 20);

    // count = 80
    $comments = WPComment::with('recipe')->orderBy('comment_date', 'desc')->get()->toArray();
    foreach ($comments as &$comment) {
        $comment['date_time'] = $comment['comment_date'];
    }

    // count = 241
    $favorites = WPFavorite::with('user', 'recipe')->orderBy('date_time', 'desc')->get()->toArray();

    // count = 321
    $mergedArray = array_merge_recursive($comments, $favorites);

    $mergedArray = collect($mergedArray);
    $mergedArray = $mergedArray->sortByDesc('date_time');
    $mergedArray = $mergedArray->groupBy('date_time');

    return $mergedArray;

    //return view('dashboard.index', compact('users', 'mergedArray'));
}

问题是我无法得到我想要的东西。如果我将日期保留为默认Carbon格式,它们似乎很好,但由于h:m:s不同,它们当然不会按天分组。但是,如果我在两个模型中改变它:

public function getDateTimeAttribute($date)
{
    return Carbon::createFromFormat('Y-m-d H:i:s', $date)->format('d.m.Y.');
}

我没有把它整理好......

我尝试通过对对象进行分组甚至将它们转换为数组然后给我回排序数组,但是这样我首先对对象进行排序,然后在第二个对象下面合并到它...

如果我在同一日期(例如今天)发布了CommentFavorite,我希望它们都位于“02 .09.2016”下的JSON文件之上

1 个答案:

答案 0 :(得分:2)

您应该能够在分组之前使用函数修改date_time来解决您的任务。请尝试以下代码:

$mergedArray = $mergedArray->groupBy(function($item)
{
    return Carbon::createFromFormat('Y-m-d H:i:s', $item['date_time'])->format('d.m.Y.');
});