检索没有嵌套循环的父项


retrieve items of a parent without nested loops

我想收藏所有书籍。书籍属于书店,在书店上,有一个全球范围。

当我这样做时:书店 = BookStore::all() 并将其传递给视图,我可以执行以下操作:伪代码:

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

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

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

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

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]

如您所见,这是您可能不想执行的任务。我这样做的方法是创建一个自定义集合并在那里添加一个books()的方法。

该方法可能如下所示:

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

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

使用递归函数,可以得到父子关系的层次结构