为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
喵喵时光机 2021-11-13 14:57:34
我想在我的博客应用程序中构建一个标签列表?我想选择所有标签,如果该标签存在多次,只选择一次?这就是我获得所有标签的方式!如何让每个标签只获得一次?$tags = Tag::all();
查看完整描述

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 个标签。


查看完整回答
反对 回复 2021-11-13
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

您可以unique()集合上使用该方法,即:

$tags = Tag::all()->unique('name');

使用您的描述符字段而不是name.

distinct()方法最好与有限的字段选择一起使用,例如:

DB::table('tags')->distinct()->get(['name']);

如果你使用distinct()on ModellikeTag::distinct()->get();你会得到所有的标签,因为它们有不同的idstimestamps即使它们有相同的名称或描述,因为在这种情况下,选择是在所有字段上。

使用模型,您必须像这样限制返回的字段:

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


查看完整回答
反对 回复 2021-11-13
  • 2 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信