合并和排序两个雄辩的收藏?

Sip*_*per 15 php mysql laravel eloquent

我有两个集合,我想将它合并到一个变量(当然,通过一个collumn排序 - created_at).我怎样才能做到这一点?

我的控制器看起来:

$replies = Ticket::with('replies', 'replies.user')->find($id);
$logs = DB::table('logs_ticket')
        ->join('users', 'users.id', '=', 'mod_id')
        ->where('ticket_id', '=', $id)
        ->select('users.username', 'logs_ticket.created_at', 'action')
        ->get();
Run Code Online (Sandbox Code Playgroud)

我的输出查找示例:

回复:

ID | ticket_id | username | message | created_at
1  | 1         | somebody | asdfghj | 2014-04-12 12:12:12
2  | 1         | somebody | qwertyi | 2014-04-14 12:11:10
Run Code Online (Sandbox Code Playgroud)

日志:

ID | ticket_id | username | action | created_at
1  | 1         | somebody | close  | 2014-04-13 12:12:14
2  | 1         | somebody |  open  | 2014-04-14 14:15:10
Run Code Online (Sandbox Code Playgroud)

我想要这样的东西:

ticket_id | table | username | message | created_at
1         |replies| somebody | asdfghj | 2014-04-12 12:12:12
1         | logs  | somebody |  close  | 2014-04-13 12:12:14
1         | logs  | somebody |  open   | 2014-04-14 11:15:10
1         |replies| somebody | qwertyi | 2014-04-14 12:11:10
Run Code Online (Sandbox Code Playgroud)

编辑:

我的票证模型看起来:

<?php

class Ticket extends Eloquent {

    protected $table = 'tickets';

    public function replies() {
        return $this->hasMany('TicketReply')->orderBy('ticketreplies.created_at', 'desc');
    }

    public function user()
    {
        return $this->belongsTo('User');
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

Dee*_*ens 24

解决您的问题的一个小解决方法.

$posts = collect(Post::onlyTrashed()->get());
$comments = collect(Comment::onlyTrashed()->get());

$trash = $posts->merge($comments)->sortByDesc('deleted_at');
Run Code Online (Sandbox Code Playgroud)

这样您就可以合并它们,即使存在重复的ID也是如此.

  • Eloquent返回一个"Eloquent Collection"并收集返回正常的"Collection"."正常"集合与"Eloquent Collection"有不同的方法. (3认同)
  • 效率低下,但工作紧张! (2认同)

ale*_*ell 20

你无法轻易得到你想要的东西.

一般来说,合并应该很容易用a $collection->merge($otherCollection);,并排序$collection->sort();.但是,由于没有唯一的ID,并且您需要的"表格"列,合并将无法按您希望的方式运行,您必须手动完成.

它们实际上都是我认为的不同类型的集合(一个基于一个Eloquent\Model将是Eloquent\Collection,另一个是标准Collection),这可能会导致自己的问题.因此,我建议对两者使用DB :: table(),并使用您可以控制的列来扩充结果.

至于实现这一点的代码,我不确定我在Laravel中没有做很多低级数据库工作,因此不知道创建查询的最佳方法.无论哪种方式,只是因为看起来开始很难通过两个查询和一些PHP合并来管理它,我建议在一个数据库查询中完成所有操作.它实际上看起来更整洁,可以说更易于维护:

您需要的SQL是这样的:

SELECT * FROM
(
    SELECT
        `r`.`ticket_id`,
        'replies' AS `table`,
        `u`.`username`,
        `r`.`message`,
        `r`.`created_at`
    FROM `replies` AS `r`
    LEFT JOIN `users` AS `u`
        ON `r`.`user_id` = `u`.`id`
    WHERE `r`.`ticket_id` = ?
) UNION (
    SELECT
        `l`.`ticket_id`,
        'logs' AS `table`,
        `u`.`username`,
        `l`.`action` AS `message`,
        `l`.`created_at`
    FROM `logs` AS `l`
    LEFT JOIN `users` AS `u`
        ON `l`.`user_id` = `u`.`id`
    WHERE `l`.ticket_id` = ?
)
ORDER BY `created_at` DESC
Run Code Online (Sandbox Code Playgroud)

这是非常不言自明的:做两个查询,返回相同的列,UNION然后在MySQL中对结果集进行排序.希望它(或类似的东西,因为我不得不猜测你的数据库结构)将适合你.

至于将其翻译成Laravel DB::风格的查询,我想这取决于你.