2016-02-09 17 views
0

Я хочу иметь коллекцию со всеми книгами. Книги принадлежат книжному магазину и книжному магазину, существует глобальный масштаб.Извлечение предметов родителя без вложенных циклов

Когда я делаю: книжные магазины = Книжный магазин :: все() и передать это тем, что я могу сделать: псевдокод:

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

Как я могу сортировать все мои книги по названию, например (и не первый на книжном магазине, а затем книги, как в приведенном выше примере)

Я не могу использовать $ книг = книги :: все(), потому что сфера находится на книжном магазине

ответ

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 модели и вернуть вашу пользовательскую коллекцию. Это также приведет к синтаксису, который вы использовали в вашем примере (в комментарии ниже).

+0

Если я положил $ collection = BookStore :: with (['books' => function ($ query) { $ query-> orderBy ('name'); }]) - get(); и передать переменную коллекции на мой взгляд, как мне получить список всех книг? @foreach ($ collection-> books() как $ book)? – user3253002

+0

Я обновил пример. Это было слишком много, чтобы правильно объяснить комментарий. –

0

Использование рекурсивной функции, вы можете получить иерархию с материнская и детская отношения

Смежные вопросы