Collectionでのmap()transform()のメソッドは似ているようで大きな違いがあります。

まず、テストデータのレコードをtinkerで3つ作成します。

>>> User::factory(3)->create();

=> Illuminate\Database\Eloquent\Collection {#4463
     all: [
       App\Models\User {#4464
         id: 1,
         name: "坂本 知実",
         email: "tfujimoto@example.net",
         email_verified_at: "2022-04-03 02:36:03",
         #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
         #remember_token: "mBZjRiwtp2",
         created_at: "2022-04-03 02:36:03",
         updated_at: "2022-04-03 02:36:03",
       },
       App\Models\User {#4465
         id: 2,
         name: "高橋 知実",
         email: "kazuya.miyazawa@example.net",
         email_verified_at: "2022-04-03 02:36:03",
         #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
         #remember_token: "2ERHaySLEo",
         created_at: "2022-04-03 02:36:03",
         updated_at: "2022-04-03 02:36:03",
       },
       App\Models\User {#4466
         id: 3,
         name: "藤本 修平",
         email: "mkiriyama@example.net",
         email_verified_at: "2022-04-03 02:36:03",
         #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
         #remember_token: "JpPxv9yr0d",
         created_at: "2022-04-03 02:36:03",
         updated_at: "2022-04-03 02:36:03",
       },
     ],
   }

作成されたレコードを$usersの変数に入れます。

>>> $users = User::all();

map()transform()もCollectionの中のそれぞれのアイテムを処理してCollectionの値を返すのは同じです。

まず、mapから、

>>> $users->map(function ($user) {
        return $user->only(['id', 'name']);
    })

=> Illuminate\Support\Collection {#4473
     all: [
       [
         "id" => 1,
         "name" => "坂本 知実",
       ],
       [
         "id" => 2,
         "name" => "高橋 知実",
       ],
       [
         "id" => 3,
         "name" => "藤本 修平",
       ],
     ],
   }

この後に$usersの中身を見てみましょう。

>>> $users

=> Illuminate\Database\Eloquent\Collection {#4463
     all: [
       App\Models\User {#4464
         id: 1,
         name: "坂本 知実",
         email: "tfujimoto@example.net",
         email_verified_at: "2022-04-03 02:36:03",
         #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
         #remember_token: "mBZjRiwtp2",
         birth_date: "1988-03-20",
         created_at: "2022-04-03 02:36:03",
         updated_at: "2022-04-03 02:36:03",
       },
       App\Models\User {#4465
         id: 2,
         name: "高橋 知実",
         email: "kazuya.miyazawa@example.net",
         email_verified_at: "2022-04-03 02:36:03",
         #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
         #remember_token: "2ERHaySLEo",
         birth_date: "1975-06-25",
         created_at: "2022-04-03 02:36:03",
         updated_at: "2022-04-03 02:36:03",
       },
       App\Models\User {#4466
         id: 3,
         name: "藤本 修平",
         email: "mkiriyama@example.net",
         email_verified_at: "2022-04-03 02:36:03",
         #password: "$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi",
         #remember_token: "JpPxv9yr0d",
         birth_date: "2011-06-17",
         created_at: "2022-04-03 02:36:03",
         updated_at: "2022-04-03 02:36:03",
       },
     ],
   }

何も変わっていませんね。
今度は、transformです。

>>> $users->transform(function($user) {
        return $user->only(['id', 'name']);
})

=> Illuminate\Database\Eloquent\Collection {#4463
     all: [
       [
         "id" => 1,
         "name" => "坂本 知実",
       ],
       [
         "id" => 2,
         "name" => "高橋 知実",
       ],
       [
         "id" => 3,
         "name" => "藤本 修平",
       ],
     ],
   }

ここまではmapの結果とまったく同じですね。
しかし、もとの変数の中身を見ると、

>>> $users

=> Illuminate\Database\Eloquent\Collection {#4463
     all: [
       [
         "id" => 1,
         "name" => "坂本 知実",
       ],
       [
         "id" => 2,
         "name" => "高橋 知実",
       ],
       [
         "id" => 3,
         "name" => "藤本 修平",
       ],
     ],
   }

中身が返り値と同じ値で上書きとなっているのです。transformという名前はそれゆえにです。

By khino