Laravel 5.5 - Объединить 2 коллекции в одну на основе идентификатора? - PullRequest
0 голосов
/ 30 октября 2018

Так у меня 2 модели Books и Classes:

$books = Books::limit(3)->get(['id','classable_id','easy_book']);
// Books returned:
{ id: 200,
  classable_id: 2,
  easy_book: false
},
{ id: 201,
  classable_id: 3,
  easy_book: true
},
{ id: 202,
  classable_id: 4,
  easy_book: false
}

$classIds = $books->pluck('classable_id');

$classes = Classes::whereIn('id', $classIds);
// Classes returned:
{ id: 2, 
  subject: Math, 
  students: 30
},
{ id: 3, 
  subject: History, 
  students: 30
},
{ id: 4,
  subject: Physics,
  students: 30
}

Затем пытаемся получить следующий вывод (без объединения запросов, но с разделением их, как описано выше, и просто используя логику php для вывода):

Classes returned:
{ id: 2,
  subject: Math,
  students: 30.
  easy_book: false }, // trying to merge this!
{ id: 3,
  subject: History,
  students: 30.
  easy_book: true}, // trying to merge this!
{ id: 4,
  subject: Physics,
  students: 30.
  easy_book: false } // trying to merge this!

Обычно я пытаюсь объединить поле easy_book из books, возвращенного в соответствующий class, возвращенный на основе class.id == books.classable_id. Есть идеи, как это слить?

1 Ответ

0 голосов
/ 30 октября 2018

Добавьте отношение к вашей модели Книги следующим образом:

public function class() {
    return $this->belongsTo(Classes::class, 'id', 'classable_id);
}

Тогда вы можете сделать:

Book::with('class')->select('id', 'classable_id', 'easy_book')->limit(3)->get();

Каждый элемент коллекции будет иметь коллекцию классов, где это применимо.

Если после этого вы хотите манипулировать ими, вы можете использовать функцию карты, как описано здесь: https://laravel.com/docs/5.7/collections#method-map

...