Laravel:如何根据嵌套关系的数量显示“多对多”

时间:2018-09-02 11:50:19

标签: laravel collections many-to-many has-many-through

在通过两个多对多关系找到嵌套关系的最佳方法方面,我面临着一个小困难。

我有3种模型:具有以下关系的文章,关键字和主题:

文章<->关键字(很多);

文章<->主题(很多)。

我想做的是根据主题的所有文章获得一个主题的关键字,以便将它们显示为可缩放大小的气泡。

到目前为止的代码:

$subject = Subject::with('articles.keywords')->find($id);
    $keywordsArray = $subject->articles->pluck('keywords');
    $keywords = (new Collection($keywordsArray))->collapse()->groupBy('id');

return $keywords; // returns the collection with all the duplicate keywords
return $keywords->unique('id') // returns unique keywords.

我知道要像这样从集合中返回计数映射:

$keywordsCount = (new Collection($keywordsArray))->collapse()->groupBy('id')->map(function($item, $key){
        return $item->count();
    });
    return $keywordsCount; // returns ex: {"1":2,"2":2,"3":2,"6":1}

一切正常,剩下的唯一问题是:如何将唯一关键字与$ keywordsCount合并,或者,利用这两个关键字的最佳方法是什么,以便我可以基于该计数来调整关键字气泡的大小。

在此先感谢并感谢上帝。

1 个答案:

答案 0 :(得分:0)

这取决于您需要多长时间检索一次合并的信息,但是对于您现在检索的那个集合,您始终可以简单地将计数作为临时属性分配给该集合中的每个当前keyword实例。 另外,您也可以将它们打包成一个数组,对此,我只需要使用zip()收集方法即可:

return $keywords->unique('id')->zip($keywordsCount);

这将创建一个像[['keyword1', 1], ['keyword2', 3], ...]这样的耦合数组的集合,从而按您的意愿合并信息。