Laravel 5.5-根据ID将2个集合合并为一个?

时间:2018-10-29 21:40:02

标签: laravel eloquent laravel-5.5

所以我有2个模型BooksClasses

$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 :(得分:1)

像这样向您的“图书”模型添加关系:

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

那么您可以做:

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

每个集合项将在适用时具有一个类的集合。

如果之后要操作它们,则可以使用此处记录的map函数:https://laravel.com/docs/5.7/collections#method-map