我要在博客应用程序中构建标签列表吗?我想选择所有标签,并且如果该标签不止一次存在,请仅选择一次?
这就是我获取所有标签的方式!如何仅一次获得每个标签?
$tags = Tag::all();
答案 0 :(得分:0)
查询
如果您只是在寻找标记名称的不同列表,则可以结合使用distinct()
方法和pluck()
方法:
$tags = Tag::distinct()->pluck('name');
这将为您提供系统中所有唯一标记名称的集合。
如果您实际上需要使用Tag模型实例,则可以尝试两件事。
首先,如果您有完全重复的标记行,则可以将distinct()
添加到标记查询中(由于需要修改查询,因此您需要将使用all()
更改为{ {1}}(read more here):
get()
第二,如果您的代码包含其他非不同的信息(ID,时间戳等),则该信息将无效。如果是这种情况,则需要使用子查询来选择所需的标签:
$tags = Tag::distinct()->get();
这将为您提供唯一名称集的完全填充的Tag模型实例。
收藏集
最后,如果您已经具有Tag实例的集合,并且想要基于名称获得唯一的集合,则可以在集合上使用$tags = Tag::whereIn('id', Tag::groupBy('name')->selectRaw('MAX(id)'))->get();
方法。
unique
如果您还没有该集合,请确保使用上面的查询构建器方法之一。如果使用收集方法,则必须先构建并混合所有Tag模型实例,然后再进行唯一处理。当您只想从数据库中只获取那30个唯一标签时,您不希望最终获取和混合10000个Tag模型实例。
答案 1 :(得分:0)
您可以在集合上使用unique()
方法,即:
$tags = Tag::all()->unique('name');
使用您的描述符字段代替name
。
distinct()
方法最好用于有限的字段选择,例如:
DB::table('tags')->distinct()->get(['name']);
如果您像distinct()
在Model
上使用Tag::distinct()->get();
,则会得到所有标签,因为它们具有不同的ids
和timestamps
,即使它们具有名称或说明相同,因为在这种情况下,选择位于所有字段上。
对于模型,您必须限制返回的字段,如下所示:
Tag::distinct()->get(['name']);