Laravel渴望加载:使用关系列排序

时间:2018-11-30 13:13:19

标签: php laravel eloquent

我有两个表postsauthors,两个表具有一对多关系

posts table
id    title    author_id
1     Post 1   1
2     Post 2   2
3     Post 3   1

authors table
id    name
1     A
2     B

我想选择所有帖子,但按作者姓名排序,使用Laravel的“急切加载”是否可以实现以下输出结果

[
  {
  "id": 1,
  "title": "Post 1",
  "author_id": 1,
    "author": {
    "id": 1,
    "name": "A"
    }
  },
  {
  "id": 3,
  "title": "Post 3",
  "author_id": 1,
    "author": {
    "id": 1,
    "name": "A"
    }
  },
  {
  "id": 2,
  "title": "Post 2",
  "author_id": 2,
    "author": {
    "id": 2,
    "name": "B"
    }
  }
]

我尝试了以下操作,但没有用:

Post::with(['author' => function($query){
    $query->orderBy('name', 'asc');
}])->get();

1 个答案:

答案 0 :(得分:0)

如果您只想订购少量元素,则可以使用其collection函数订购所得的SortBy()

$posts = Post::with('author')
         ->get()
         ->sortBy(function ($post) {
             return $post->author->name;
         });

现在,在分页结果时这将无法按预期进行。

对于这些情况,我将采用另一种方法:首先订购作者,然后访问其帖子:

$authors = Author::with('posts')->orderBy('name')->get();

$posts = $authors->map(function ($author) {
    return $author->posts;
});