我有两张桌子。 1篇文章表和1个标签表。我需要找出文章表中所有文章中使用标记的次数。 目前我正在使用以下代码来获取它。但它的过程较慢。有没有更好的方法或laravel查询,以使其更快?
$tags = Tag::get();
$array = array();
foreach($tags as $tag){
$articles = count(Article::where('public', '1')->where('tags', 'rlike', $tag->tag)->get());
if ($articles > 0) {
$array[] = array(
$tag->tag => $articles
);
}
}
return json_encode($aaa);
答案 0 :(得分:1)
嗯,问题是你有一个多对多的关系,但是没有规范化的表。我建议您调整数据库表格,因为这样您就可以$tag->articles()->count()
获取使用特定$tag
的文章数量,而无需加载项目。
一个伟大的结构将是:
articles (Table for your articles)
id
public
...
tags (Tag data table)
id
name
...
articles_tags (Pivot table)
article_id
tag_id
关于多对多关系的文件中还有一个great chapter。
答案 1 :(得分:0)
你可以按照@manniL的建议重新安排你的关系,或者只是做一个非常快的原始查询:
$result = DB::table('tags')
->leftjoin('articles', 'articles.tags', 'rlike', 'tags.name')
->selectRaw('tags.name, count(articles.id) as total')
->groupBy('tags.name')
->get();
这将返回类似
的内容[
{'name': 'tag1', 'total': 3},
{'name': 'tag2', 'total': 2},
{'name': 'tag3', 'total': 7}
]
希望这有助于任何人。