2 回答
TA贡献1856条经验 获得超17个赞
查询
如果您只是在寻找标签名称的不同列表,您可以组合distinct()方法和pluck()方法:
$tags = Tag::distinct()->pluck('name');
这将为您提供系统中所有唯一标签名称的集合。
如果您确实需要拥有 Tag 模型实例,您可以尝试两件事。
首先,如果你有完全重复的标签行,你可以添加distinct()到你的标签查询中(因为你需要修改查询,你需要从 using 更改all()为get()(在此处阅读更多):
$tags = Tag::distinct()->get();
其次,如果您的标签有其他不明确的信息(ID、时间戳等),那将不起作用。如果是这种情况,您需要使用子查询来选择您想要的标签:
$tags = Tag::whereIn('id', Tag::groupBy('name')->selectRaw('MAX(id)'))->get();
这将为您的唯一名称集提供完全填充的 Tag 模型实例。
收藏
最后,如果您已经有一个 Tag 实例的集合,并且您想根据名称获得一个唯一的集合,您可以unique在集合上使用该方法。
// somewhere
$tags = Tag::get();
// somewhere else
$tags = $tags->unique('name');
如果您还没有该集合,请确保使用上述查询构建器方法之一。如果使用collection方式,则必须先构建并水化所有Tag模型实例,然后再进行唯一处理。您不希望获取和水合 10000 个标签模型实例以最终得到 30 个独特的标签,而此时您可以首先从数据库中获取这 30 个标签。
TA贡献1836条经验 获得超13个赞
您可以unique()
在集合上使用该方法,即:
$tags = Tag::all()->unique('name');
使用您的描述符字段而不是name
.
该distinct()
方法最好与有限的字段选择一起使用,例如:
DB::table('tags')->distinct()->get(['name']);
如果你使用distinct()
on Model
likeTag::distinct()->get();
你会得到所有的标签,因为它们有不同的ids
,timestamps
即使它们有相同的名称或描述,因为在这种情况下,选择是在所有字段上。
使用模型,您必须像这样限制返回的字段:
Tag::distinct()->get(['name']);
- 2 回答
- 0 关注
- 123 浏览
添加回答
举报