[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FETDMX85EEY30XMNT7528P":3,"skill-same:01M6FETDMX85EEY30XMNT7528P":48},{"skillNo":4,"name":5,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":17,"publishedAt":21,"linkOnly":22,"markdownContent":23,"markdownBody":23,"frontMatter":24,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":30,"ownerHtmlUrl":31,"ownerBlogUrl":6,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M6FETDMX85EEY30XMNT7528P","laravel-collections",null,"ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Friasvdv\u002Fskills\u002Flaravel-collections\u002FSKILL.md",[],[18,19,20],"laravel","collections","laravel collections","2026-11-10 10:12:30",false,"# Laravel Collections\n\n## Quick Decision Guide\n\n### \"Which method do I use?\"\n\n**Find items:**\n| Need | Method |\n|------|--------|\n| First item matching condition | `first(fn)` or `firstWhere('key', 'value')` |\n| First item or throw | `firstOrFail(fn)` |\n| Exactly one match or throw | `sole(fn)` |\n| Check value exists | `contains('value')` or `contains('key', 'value')` |\n| Check key exists | `has('key')` |\n| All items match condition | `every(fn)` |\n\n**Transform items:**\n| Need | Method |\n|------|--------|\n| Transform each item | `map(fn)` |\n| Transform + flatten one level | `flatMap(fn)` |\n| Extract one field | `pluck('name')` |\n| Extract field, keyed by another | `pluck('name', 'id')` |\n| Select multiple fields | `select(['id', 'name'])` |\n| Change keys | `mapWithKeys(fn)` or `keyBy('id')` |\n| Map into class instances | `mapInto(DTO::class)` |\n\n**Filter items:**\n| Need | Method |\n|------|--------|\n| Keep matching items | `filter(fn)` |\n| Remove matching items | `reject(fn)` |\n| Filter by field value | `where('status', 'active')` |\n| Filter by field in list | `whereIn('status', ['active', 'pending'])` |\n| Keep specific keys only | `only(['id', 'name'])` |\n| Remove specific keys | `except(['password'])` |\n| Remove duplicates | `unique('email')` |\n\n**Group & organize:**\n| Need | Method |\n|------|--------|\n| Group by field | `groupBy('category')` |\n| Group with custom key+value | `mapToGroups(fn)` |\n| Split pass\u002Ffail | `partition(fn)` |\n| Key by field (1 item per key) | `keyBy('id')` |\n| Split into chunks | `chunk(100)` |\n\n**Aggregate:**\n| Need | Method |\n|------|--------|\n| Sum values | `sum('price')` |\n| Average | `avg('score')` |\n| Min\u002FMax | `min('price')` \u002F `max('price')` |\n| Reduce to single value | `reduce(fn, $initial)` |\n| Count occurrences | `countBy('type')` |\n| Percentage matching | `percentage(fn)` |\n\n**Combine collections:**\n| Need | Method |\n|------|--------|\n| Merge (overwrites string keys) | `merge($other)` |\n| Append values (re-indexes) | `concat($other)` |\n| Keep only shared values | `intersect($other)` |\n| Get values not in other | `diff($other)` |\n| Pair items by index | `zip($other)` |\n\n## Mutability Rules\n\n**Immutable** (return new collection) - almost everything:\n`map`, `filter`, `reject`, `sort`, `merge`, `pluck`, `unique`, ...\n\n**Mutating** (modify in place, return `$this`) - memorize these:\n`transform`, `push`, `prepend`, `put`, `pull`, `pop`, `shift`, `splice`, `forget`\n\n```php\n\u002F\u002F WRONG mental model:\n$filtered = $collection->push('item'); \u002F\u002F $collection IS modified\n\n\u002F\u002F Correct approach when you want immutability:\n$new = $collection->concat(['item']); \u002F\u002F $collection is unchanged\n```\n\n## Common Pitfalls\n\n### 1. `each()` vs `map()` vs `transform()`\n\n```php\n\u002F\u002F each(): Side-effects, returns ORIGINAL collection\n$users->each(fn($u) => $u->notify(new Welcome));\n\n\u002F\u002F map(): Transformation, returns NEW collection (original unchanged)\n$names = $users->map(fn($u) => $u->name);\n\n\u002F\u002F transform(): Transformation, MUTATES original collection\n$users->transform(fn($u) => $u->name); \u002F\u002F $users is now a collection of names!\n```\n\n### 2. `pluck()` key overwrites\n\nWhen using `pluck('name', 'id')`, duplicate keys silently overwrite:\n```php\ncollect([\n    ['id' => 1, 'name' => 'Alice'],\n    ['id' => 1, 'name' => 'Bob'],   \u002F\u002F Overwrites Alice\n])->pluck('name', 'id');\n\u002F\u002F [1 => 'Bob']  -- Alice is lost!\n```\nUse `groupBy` if duplicates are expected.\n\n### 3. `filter()` without callback removes all falsy values\n\n```php\ncollect([0, 1, '', 'hello', null, false, []])->filter()->all();\n\u002F\u002F [1, 'hello'] -- 0, '', null, false, [] are ALL removed\n```\nUse `whereNotNull()` if you only want to remove nulls.\n\n### 4. N+1 queries with collection iteration\n\n```php\n\u002F\u002F BAD: N+1 queries\n$users->each(fn($user) => $user->posts->count());\n\n\u002F\u002F GOOD: Eager load first\n$users->load('posts');\n$users->each(fn($user) => $user->posts->count());\n```\n\n### 5. Memory with large datasets\n\n```php\n\u002F\u002F BAD: Loads all users into memory\nUser::all()->each(fn($u) => process($u));\n\n\u002F\u002F GOOD: Constant memory with cursor\nUser::cursor()->each(fn($u) => process($u));\n\n\u002F\u002F GOOD: Chunked processing\nUser::chunk(1000, fn($users) => $users->each(fn($u) => process($u)));\n```\n\n### 6. `sort()` preserves keys\n\n```php\ncollect([3, 1, 2])->sort()->all();\n\u002F\u002F [1 => 1, 2 => 2, 0 => 3] -- keys preserved!\n\ncollect([3, 1, 2])->sort()->values()->all();\n\u002F\u002F [1, 2, 3] -- use values() to re-index\n```\n\n## Higher-Order Messages\n\nProxy pattern for clean, concise collection operations:\n\n```php\n\u002F\u002F Instead of:\n$users->map(function ($user) { return $user->name; });\n\n\u002F\u002F Write:\n$users->map->name;\n\n\u002F\u002F Works with methods too:\n$users->each->markAsVip();\n$users->sum->votes;\n$users->filter->isAdmin();\n$users->sortBy->name;\n$users->reject->isBlocked();\n$users->groupBy->department;\n```\n\nSupported on: `average`, `avg`, `contains`, `each`, `every`, `filter`, `first`, `flatMap`,\n`groupBy`, `keyBy`, `map`, `max`, `min`, `partition`, `reject`, `skipUntil`, `skipWhile`,\n`some`, `sortBy`, `sortByDesc`, `sum`, `takeUntil`, `takeWhile`, `unique`.\n\n## Extending with Macros\n\nRegister custom collection methods (typically in a service provider's `boot` method):\n\n```php\nuse Illuminate\\Support\\Collection;\n\nCollection::macro('toUpper', function () {\n    return $this->map(fn($value) => strtoupper($value));\n});\n\n\u002F\u002F Usage\ncollect(['foo', 'bar'])->toUpper(); \u002F\u002F ['FOO', 'BAR']\n```\n\n## Reference Files\n\n- **Full method reference**: See [references\u002Fmethods.md](references\u002Fmethods.md) for every Collection method with signatures and descriptions\n- **LazyCollection**: See [references\u002Flazy-collections.md](references\u002Flazy-collections.md) for LazyCollection-specific methods, usage patterns, and when to choose lazy vs eager\n",{},"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Friasvdv\u002Fskills\u002Flaravel-collections",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":7,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill laravel-collections",{"tool":40,"command":41},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill laravel-collections",{"tool":43,"command":44},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill laravel-collections","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Friasvdv\u002Fskills\u002Flaravel-collections\u002FSKILL.md",true,[],[49,63,73,82,88,95],{"skillNo":50,"name":51,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":52,"categories":53,"keywords":59,"publishedAt":21},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[54],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[60,61,62],"model","model hierarchy","model hierarchy skill",{"skillNo":64,"name":65,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":69,"publishedAt":21},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[68],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[70,71,72],"MCP","zoom","zoom mcp",{"skillNo":74,"name":75,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":21},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[79,80,81,71],"sdk","zoom apps sdk","apps",{"skillNo":83,"name":84,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":21},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[84],{"skillNo":89,"name":90,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":94,"publishedAt":21},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[93],{"categoryNo":55,"categoryName":56,"taxonomyType":57,"taxonomyTypeDesc":58},[90],{"skillNo":96,"name":97,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":7,"ownerLogin":8,"ownerAvatarUrl":9,"ownerAccountNo":10,"ownerDisplayName":11,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":21},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[97]]