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也是如此.
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::
风格的查询,我想这取决于你.