在通过两个多对多关系找到嵌套关系的最佳方法方面,我面临着一个小困难。
我有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合并,或者,利用这两个关键字的最佳方法是什么,以便我可以基于该计数来调整关键字气泡的大小。
在此先感谢并感谢上帝。
答案 0 :(得分:0)
这取决于您需要多长时间检索一次合并的信息,但是对于您现在检索的那个集合,您始终可以简单地将计数作为临时属性分配给该集合中的每个当前keyword
实例。
另外,您也可以将它们打包成一个数组,对此,我只需要使用zip()
收集方法即可:
return $keywords->unique('id')->zip($keywordsCount);
这将创建一个像[['keyword1', 1], ['keyword2', 3], ...]
这样的耦合数组的集合,从而按您的意愿合并信息。