在mapToGroups()之后按模型类型对变形模型进行分组

时间:2018-02-21 12:05:34

标签: php laravel collections

在我的应用程序中展示内容时,我需要处理不同类型的内容模型,例如MusicAuthor。为此,我有一个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,以便我可以发送每个为它设计合适的变压器。

现在已经坚持了一天半,所以如果有人能给我一些收集功夫的灵感,我真的很感激。

1 个答案:

答案 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];
    })];
});