Laravel: 如何根据嵌套关系数显示Has Many Through Many to Many
Laravel: How to display Has Many Through Many to Many based on the number of nested relationships
我在寻找通过两个多对多关系获得嵌套关系的最佳方法时遇到了一个小困难。
我有 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.
我知道 return 集合中的计数映射是这样的:
$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 合并,或者,利用这两个关键字的最佳方式是什么,以便我可以根据该计数调整关键字气泡的大小。
非常感谢,祝一切顺利。
这取决于您需要多久检索一次合并信息,但是对于您现在检索的那个集合,您始终可以简单地将计数作为临时属性分配给每个当前 keyword
实例集合。
或者,您也可以将两者打包到一个数组中,为此我会简单地使用 zip()
收集方法:
return $keywords->unique('id')->zip($keywordsCount);
这将创建像 [['keyword1', 1], ['keyword2', 3], ...]
这样的耦合数组的集合,从而按照您的意愿合并信息。
我在寻找通过两个多对多关系获得嵌套关系的最佳方法时遇到了一个小困难。
我有 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.
我知道 return 集合中的计数映射是这样的:
$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 合并,或者,利用这两个关键字的最佳方式是什么,以便我可以根据该计数调整关键字气泡的大小。
非常感谢,祝一切顺利。
这取决于您需要多久检索一次合并信息,但是对于您现在检索的那个集合,您始终可以简单地将计数作为临时属性分配给每个当前 keyword
实例集合。
或者,您也可以将两者打包到一个数组中,为此我会简单地使用 zip()
收集方法:
return $keywords->unique('id')->zip($keywordsCount);
这将创建像 [['keyword1', 1], ['keyword2', 3], ...]
这样的耦合数组的集合,从而按照您的意愿合并信息。