如何获得价值的第一实例?

时间:2019-08-03 14:08:16

标签: php laravel eloquent

我要在博客应用程序中构建标签列表吗?我想选择所有标签,并且如果该标签不止一次存在,请仅选择一次?

这就是我获取所有标签的方式!如何仅一次获得每个标签?

$tags = Tag::all(); 

2 个答案:

答案 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();,则会得到所有标签,因为它们具有不同的idstimestamps,即使它们具有名称或说明相同,因为在这种情况下,选择位于所有字段上。

对于模型,您必须限制返回的字段,如下所示:

Tag::distinct()->get(['name']);