当前位置: 首页 > 后端技术 > PHP

十五个常用的Laravel集合(Collection)_0

时间:2023-03-30 02:29:51 PHP

文章转发自专业的Laravel开发者社区,原文链接:https://learnku.com/laravel/t...LaravelEloquent通常会返回一个集合作为结果,collection包含很多有用的和强大的方法。您可以轻松地对集合进行过滤、修改等操作。在本教程中,让我们了解一下集合的常用方法和功能。收藏不限于雄辩,也可以单独使用。但是Eloquent的结果是一个集合。您可以使用辅助函数collect将数组转换为集合。下面列出的收集方法适用于雄辩的结果以及收集本身。比方说,你有一个Post模型。您会在php类别中找到所有帖子。$posts=App\Post::where('category','php')->get();上面的命令返回一个集合。集合是一个Laravel类,它在内部使用数组函数并为它们添加了很多功能。您可以使用collect方法简单地创建一个集合,如下所示:$collection=collect([['user_id'=>'1','title'=>'HelpersinLaravel','content'=>'CreatecustomhelpersinLaravel','category'=>'php'],['user_id'=>'2','title'=>'在Laravel中测试','content'=>'在Laravel中测试文件上传','category'=>'php'],['user_id'=>'3','title'=>'TelegramBot','content'=>'Laravel中的加密电报机器人','category'=>'php'],]);上面的数组其实就是Post模型的值。在本教程中,我们将使用此数组进行简化。请记住,一切都将建立在雄辩的基础上。当我们在Eloquent集合上使用辅助方法时,不再查询数据库。我们先从数据库中取出所有的结果,然后在不查询数据库的情况下,使用集合的方法进行筛选和修改。filter()过滤器是最有用的laravel集合方法之一,它允许您使用回调来过滤集合。它只传递那些返回true的项目。删除所有其他项目。filter返回一个新实例而不改变原始实例。它接受value和key作为回调中的两个参数。$filter=$collection->filter(function($value,$key){if($value['user_id']==2){returntrue;}});$过滤器->所有();all方法返回底层数组。上面的代码返回以下响应。[1=>["user_id"=>2,"title"=>"在Laravel中测试","content"=>"在Laravel中测试文件上传","category"=>"php"]]search()search查找具有给定值的集合的方法。如果该值在集合中,则返回相应的键。如果没有数据项匹配相应的值,则返回false。$names=collect(['Alex','John','Jason','Martyn','Hanlin']);$names->search('Jason');//2搜索方式默认使用松散比较.您可以在其第二个参数中传递true以使用严格比较。您还可以将自己的回调函数传递给搜索方法。将返回通过回调真值测试的第一个项目的键。$names=collect(['Alex','John','Jason','Martyn','Hanlin']);$names->search(function($value,$key){returnstrlen($value)==6;});//3chunk()chunk方法将集合分成多个给定大小的更小的集合。用于将集合显示到网格中。$prices=collect([18,23,65,36,97,43,81]);$prices=$prices->chunk(3);$prices->toArray();以上代码生成效果。[0=>[0=>18,1=>23,2=>65],1=>[3=>36,4=>97,5=>43],2=>[6=>81]]dump()转储方法打印集合。它可用于从任何位置调试和查找集合中的内容。$collection->whereIn('user_id',[1,2])->dump()->where('user_id',1);转储上述代码的结果。map()map方法用于遍历整个集合。它接受回调作为参数。值和键被传递给回调。回调可以修改值并返回。最后,返回修改项的新集合实例。$changed=$collection->map(function($value,$key){$value['user_id']+=1;return$value;});返回$changed->all();基本上,它会将user_id加1。上面代码的响应如下所示。[["user_id"=>2,"title"=>"HelpersinLaravel","content"=>"CreatecustomhelpersinLaravel","category"=>"php"],["user_id"=>3,"title"=>"在Laravel中测试","content"=>"在Laravel中测试文件上传","category"=>"php"],["user_id"=>4,"title"=>"TelegramBot","content"=>"Laravel中的加密电报机器人","category"=>"php"]];zip()Zip方法会将给定数组的值与集合的值合并。相同索引的值被加在一起,这意味着,数组的第一个值与集合的第一个值合并。在这里,我将使用我们刚刚在上面创建的集合。这也适用于Eloquent集合。$zipped=$collection->zip([1,2,3]);$zipped->all();JSON响应如下所示。所以,基本上就是这样。如果数组的长度小于集合的长度,Laravel将null附加到Collection类型的剩余元素。类似地,如果数组的长度大于集合的长度,Laravel会为Collection类型的元素添加null,然后是数组的值。whereNotIn()可以使用whereNotIn方法通过不包含在给定数组中的键值来简单地过滤集合。它基本上与whereIn相反。此外,此方法在匹配值时使用宽松的比较==。让我们过滤$collection,其中user_id既不是1也不是2。$collection->whereNotIn('user_id',[1,2]);上面的语句将只返回$collection中的最后一项。第一个参数是键,第二个参数是值数组。在eloquent的情况下,第一个参数将是列的名称,第二个参数将是一个值数组。max()max方法返回给定键的最大值。你可以通过调用max找到最大的user_id。它通常用于比较价格或任何其他数字,但为了演示,我们使用user_id。它也可以用于字符串,在这种情况下Z>a。$collection->max('user_id');上面的语句将返回最大的user_id,在我们的例子中是3。pluck()pluck方法返回指定键的所有值。它对于提取列的值很有用。$title=$collection->pluck('title');$标题->全部();结果看起来像这样。["HelpersinLaravel","TestinginLaravel","TelegramBot"]使用Eloquent时,可以将列名作为参数传递以提取值。pluck还接受第二个参数,它可以是雄辩集合的另一个列名。它将产生一个由第二个参数的值作为键的集合。$title=$collection->pluck('user_id','title');$title->all();结果如下:["HelpersinLaravel"=>1,"TestinginLaravel"=>2,"TelegramBot"=>3]each()each是一种遍历整个集合的简单方法。它接受带有两个参数的回调:它正在迭代的项目和键。Key是一个从0开始的索引。$collection->each(function($item,$key){info($item['user_id']);});上面的代码只是记录了每个item的user_id。在迭代Eloquent集合时,您可以访问所有列值作为项目属性。以下是我们如何遍历所有帖子。$posts=App\Post::all();$posts->each(function($item,$key){//做点什么});如果在回调中返回false,它将停止迭代项目。$collection->each(function($item,$key){//任务if($key==1){returnfalse;}});tap()tap()方法允许您随时添加到集合中。它接受回调并传递并将集合传递给它。您可以在不更改集合本身的情况下对项目执行任何操作。因此,您可以随时使用tap加入集合,而无需更改集合。$collection->whereNotIn('user_id',3)->tap(function($collection){$collection=$collection->where('user_id',1);info($collection->values());})->全部();在上面使用的tap方法中,我们修改了集合,然后记录了值。您可以随心所欲地使用收藏集。上述命令的响应是:[["user_id"=>"1","title"=>"HelpersinLaravel","content"=>"CreatecustomhelpersinLaravel","category"=>"php"],["user_id"=>"2","title"=>"在Laravel中测试","content"=>"在Laravel中测试文件上传","category"=>"php"]]你可以看到tapCollection实例没有被修改。pipe()pipe方法与tap方法非常相似,因为它们都用于收集管道。pipe方法将集合传递给回调并返回结果。$collection->pipe(function($collection){return$collection->min('user_id');});上述命令的响应是1。如果从管道回调返回集合实例,也可以链接其他方法。contains()contains方法只是检查集合是否包含给定的值。这仅在仅传递一个参数时发生。$contains=collect(['country'=>'USA','state'=>'NY']);$contains->contains('USA');//true$contains->contains('UK');//false如果将键/值对传递给contains方法,它将检查给定的键/值对是否存在。$collection->contains('user_id','1');//true$collection->contains('title','NotFoundTitle');//false也可以将回调作为参数传递给回调方法。将为集合中的每个项目运行回调,如果任何项目通过真值测试,它将返回true,否则返回false。$collection->contains(function($value,$key){returnstrlen($value['title'])<13;});//true回调函数接受当前迭代的两个参数值项目和关键。这里我们只是检查头部的长度是否小于13。在TelegramBot中它是12,所以它返回true。forget()forget只是从集合中删除该项目。您只需传递一个键,它就会从集合中删除该项目。$forget=collect(['country'=>'usa','state'=>'ny']);$forget->forget('国家')->all();上面的代码响应如下:["state"=>"ny"]forget不适用于多维数组。avg()av??g方法返回平均值。您只需传递一个键作为参数,然后avg方法返回平均值。您还可以使用average方法,它基本上是avg的别名。$avg=collect([['鞋子'=>10],['鞋子'=>35],['鞋子'=>7],['鞋子'=>68],])->avg('鞋子'');上面的代码返回30,这是所有四个数字的平均值。如果您没有将任何键传递给avg方法并且所有项目都是数字,它将返回所有数字的平均值。如果键没有作为参数传递并且集合包含键/值对,则avg方法返回0。$avg=collect([12,32,54,92,37]);$平均->平均();上面的代码返回45.4,这是所有五个数字的平均值。你可以使用这些laravel集合方法来处理你自己项目中的集合。