Laravel 雄辩的一对多订货人

Laravel 雄辩的一对多订货人,laravel,laravel-4,eloquent,Laravel,Laravel 4,Eloquent,我正在和雄辩者合作一对多的关系 我想使用用户在上一次发布日期时创建的方式来订购用户,但我不知道如何才能做到这一点 表格用户: id | name 1 | John 2 | Doe 3 | Foo 4 | ... 表员额: id | title | body | user_id | created_at 1 | Title 1| Body1 | 1 | 2014-03-06 14:00:00 2 | Title 2| Body2 | 1 |

我正在和雄辩者合作一对多的关系

我想使用用户在上一次发布日期时创建的方式来订购用户,但我不知道如何才能做到这一点

表格用户:

 id | name 
 1  | John 
 2  | Doe
 3  | Foo
 4  | ...
表员额:

id | title  | body  | user_id | created_at 
1  | Title 1| Body1 | 1       | 2014-03-06 14:00:00
2  | Title 2| Body2 | 1       | 2014-03-04 14:00:00
3  | Title 3| Body3 | 2       | 2014-03-03 14:00:00
4  | Title 4| Body4 | 3       | 2014-03-05 14:00:00
所需的最终输出示例:

name | title   | created_at
John | Title 1 | 2014-03-06 14:00:00
Foo  | Title 4 | 2014-03-05 14:00:00
Doe  | Title 3 | 2014-03-03 14:00:00
我能接近的是:

$users = User::with(['posts' => function($query){
     $query->orderBy('created_at', 'desc');
}])->get();
但是这段代码提取每个用户的所有帖子,我只想要最后一篇

你能帮我吗?谢谢

更新:我终于找到了我想要的东西:检索用户的最后一篇文章,并按照最后一篇文章的时间戳的升序对用户进行排序。请随意改进此查询

$users = DB::table('posts')
    ->join('users', 'posts.user_id', '=', 'users.id')
    ->select(DB::raw('posts.id, posts.user_id, MAX(created_at) as created_at'))
    ->groupBy('posts.user_id')
    ->orderBy('created_at', 'asc')
    ->get();
你可以试试这个:

$users = User::with(array('posts' => function($query){
    $query->orderBy('created_at', 'desc')->groupBy('user_id');
}))->get();
$users = User::join('posts', 'users.id', '=', 'posts.user_id')
             ->orderBy('posts.created_at', 'desc')
             ->groupBy('posts.user_id')
             ->select('users.*', 'posts.created_at as postTime')
             ->get();
更新:您可以尝试以下操作:

$users = User::with(array('posts' => function($query){
    $query->orderBy('created_at', 'desc')->groupBy('user_id');
}))->get();
$users = User::join('posts', 'users.id', '=', 'posts.user_id')
             ->orderBy('posts.created_at', 'desc')
             ->groupBy('posts.user_id')
             ->select('users.*', 'posts.created_at as postTime')
             ->get();
我只从posts表中选择了created_,但您可以在select中添加更多字段,如:


我相信你要么必须使用稍微复杂一点的usort,要么可以使用连接,但是使用这种方法,你也会失去雄辩建立关系的方式

使用usort


这是答案的一半。现在,我只获得用户集合中的最后一个发布数据。现在,我想根据用户最后一次发布的时间戳对其进行排序。我真的不知道该怎么做。我的结构是否错误?请检查更新的答案。如果使用$users->toArray,结果将是一个不同的联接表,但您可以使用类似$users->first->posts->first的内容。非常感谢!正是我要找的!通过此查询,是否有一种简单的方法可以使用posts.created_at重新排序,但按升序排序?换句话说,以升序获取用户的最后一篇文章。对不起!我认为这是不可能的,但如果可能的话,我会发帖的。
$users = DB::table('posts')
    ->select(DB::raw('MAX(`posts`.`created_at`) AS `created_at`, `user_id`, `users`.*'))
    ->orderBy('posts.created_at', 'desc')
    ->groupBy('posts.user_id')
    ->join('users', 'users.id', '=', 'posts.user_id')
    ->get();