检索没有嵌套循环的父项

时间:2016-02-09 03:54:27

标签: php laravel-5 laravel-5.2

我希望收藏所有书籍。书籍属于书店,书店也有全球范围。

当我这样做时:bookstores = BookStore :: all()并将其传递给视图,我可以这样做: 伪代码:

for each $bookstores as $bookstore
   for each $bookstore->books as $book
   end
end

我如何按名称对所有书籍进行排序(而不是先按书店排序,然后按照示例中的书籍排序)

我不能使用$ books = Books :: all(),因为范围在Bookstore上

2 个答案:

答案 0 :(得分:2)

您可以在抓取时对它们进行排序:

BookStore::with(['books' => function($query) {
    $query->orderBy('name');
}])-get();

要从下面的评论中回答您关于获取所有图书的其他问题。你可以运行这样的东西:

$collection->pluck('books')->collapse()->sortBy('name')

pluck('books')基本上抓住了书店的所有书籍。这将是这样的:

[[book-a, book-c], [book-b]]

collapse()将合并所有嵌套数组,将结果更改为:

[book-a, book-c, book-b]

正如您所看到的那样,排序再次关闭,为了解决此问题,将调用此sortBy('name'),结果如下:

[book-a, book-b, book-c]

正如你所看到的,这是“非常”。您可能不想在视图中执行的任务。我这样做的方法是创建custom collection并在那里添加方法books()

该方法可能如下所示:

public function books()
{
    return $this->pluck('books')->collapse()->sortBy('name');
}

然后,您必须确保覆盖newCollection模型中的Book方法并返回自定义集合。这也会导致您在示例中使用的语法(在下面的注释中)。

答案 1 :(得分:0)

使用递归函数,您可以获得具有父子关系的层次结构