在我的应用程序中展示内容时,我需要处理不同类型的内容模型,例如Music
和Author
。为此,我有一个Feature模型和FeaturableTrait(包含我添加到Featurable模型的morphTo()
关系。
我的功能模型如下所示:
class Feature extends BaseModel
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = ['name', 'featurable_id', 'featurable_type'];
/**
* Get all of the owning featurable models.
*/
public function featurable()
{
return $this->morphTo();
}
}
为了使事情进一步复杂化,我在我的精选部分中有不同的子部分,如" Spotlight","编辑选择","趋势&# 34;等
在我的FeatureController
中,我需要从features
表中提取所有记录,根据name
属性将它们映射到组,然后再按{{{{}}对结果组进行分组1}}以便应用可以在UI中区分它们。
到目前为止,我已经完成了:
featurable_type
我希望结果包含一系列精选部分,其中有一个单独的集合,用于区分// Get the records from the database and eager load the featurable model
$features = Feature::with(['featurable'])
->orderBy('name')
->orderBy('featurable_type')
->get();
// Separate into collection groups based on the feature sub-section
$features = $features->mapToGroups(function ($item, $key) {
return [$item['name'] => $item['featurable']];
});
// Do something to separate the featurable models in each subsection by model type
// Return the result
return $features;
和featurable_type
模型的每个Music
,以便我可以发送每个为它设计合适的变压器。
现在已经坚持了一天半,所以如果有人能给我一些收集功夫的灵感,我真的很感激。
答案 0 :(得分:0)
尝试使用eachSpread
向下钻取并进一步对集合进行分组:
$features = $features->mapToGroups(function ($item, $key) {
return [$item['name'] => $item['featurable']];
})->eachSpread(function ($name, $collection) {
return [$name => $collection->mapToGroupsfunction ($item, $key) {
return [$item['featurable_type'] => $item];
})];
});