Laravelをフレームワークとして使う1つの魅力は、Collectionにあります。Eloquentでデータベースから取得した後のレコード処理がとてもエレガントにわかりやく書くことができます。というものの、Laravelのマニュアルに出てくるCollectionの例は配列ベースをcollect()したものばかりで物足りません。ということで、ここでCollectionの紹介を兼ねてDBからの取得にCollectionのメソッドを適用する例を掲載します。
準備
まずは、DBレコード取得ための準備から。
ここでで作成したLaravelのプロジェクトをもとにします。
そこで使用されている、DBテーブルにある項目を追加したいので、まずはmigrationを作成します。
$ php artisan make:migration add_new_fields_to_users_table --table=users Created Migration: 2021_05_30_213829_add_new_fields_to_users_table
以下のようにusersのDBテーブルにbirth_date、つまり誕生日の項目を追加します。
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddNewFieldsToUsersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('users', function (Blueprint $table) {
$table->date('birth_date')->nullable()->after('remember_token');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('users', function (Blueprint $table) {
$table->dropColumn('birth_date');
});
}
}
そして、migrationを実行してDBに項目を追加します。
$ php artisan migrate Migrating: 2021_05_30_213829_add_new_fields_to_users_table Migrated: 2021_05_30_213829_add_new_fields_to_users_table (0.09 seconds)
次に、factoryで自動データ作成のために項目を追加します。
...
$factory->define(User::class, function (Faker $faker) {
return [
'name' => $faker->name(),
'email' => $faker->unique()->safeEmail(),
'email_verified_at' => now(),
'password' => Hash::make('password'),
'remember_token' => Str::random(10),
'birth_date' => $faker->date(),
];
});
tinkerでdate_birthを追加したusersのレコードを3つ作成します。
>>> User::truncate()
=> Illuminate\Database\Eloquent\Builder {#3302}
>>> factory(\App\User::class, 3)->create()
=> Illuminate\Database\Eloquent\Collection {#4258
all: [
App\User {#4254
name: "坂本 充",
email: "nishida@example.net",
email_verified_at: "2021-05-30 21:55:14",
#password: "$2y$10$snEjTmJvBDu3uxd1bz0QDupihJA3zjvEH5J0pm/aLHG4UvpSfJe/q",
#remember_token: "j8hPjp8ob7",
birth_date: "1997-03-02",
updated_at: "2021-05-30 21:55:14",
created_at: "2021-05-30 21:55:14",
id: 1,
},
App\User {#4252
name: "藤本 和也",
email: "yoshida.kana@example.com",
email_verified_at: "2021-05-30 21:55:14",
#password: "$2y$10$QiozldxVUo3LLj347mqHxeoDh5TEcjddDwc6vN8Pv5b4kPgPUgjri",
#remember_token: "frW94QFFZh",
birth_date: "2005-10-03",
updated_at: "2021-05-30 21:55:14",
created_at: "2021-05-30 21:55:14",
id: 2,
},
App\User {#4251
name: "近藤 知実",
email: "atsushi.ito@example.net",
email_verified_at: "2021-05-30 21:55:14",
#password: "$2y$10$A7xldQvOiCfUOyNS57EEYu2/s77a70BPmGoOjzDSgTmveeRlcAD8.",
#remember_token: "qOFWQFb5ER",
birth_date: "1972-09-14",
updated_at: "2021-05-30 21:55:14",
created_at: "2021-05-30 21:55:14",
id: 3,
},
],
}
Collectionから1つの値を返すメソッド
DBレコードが揃ったところで、CollectionのメソッドをEloquentで取得したCollectionに適用です。
今回は、1つの値だけを返す簡単なメソッドの紹介をします。
まずは、Collectionのレコード数が必要なら以下のようにcount()をチェーンして返すことできます。
>>> User::all()->count()
=> 3
>>> User::where('id', '>', 1)->get()->count()
=> 2
ここDB処理でも同じことできますけれど、それに関しては「Eloquentでカウントするときの注意」で説明しています。
次の例ではmax()、min()はそれぞれ最大値と最小値を返してくれます。この手の集計関数は他にも、avg()、median()、reduce()、sum()もあります。
>>> User::all()->max('birth_date')
=> "2005-10-03"
>>> User::all()->min('birth_date')
=> "1972-09-14"
次の例はブーリアン値を返すメソッドです。
contains()は、含んでいるならブーリアン値のtrueを返します。
>>> User::all()->contains(function($item) {
return $item->birth_date === '2005-10-03';
})
=> true
また、EloquentのモデルのUserのプライマリキーを引数として渡すこともできます。これは通常のCollectionには適用不可でEloquentのCollectionのみに使用できるメソッドです。
>>> User::all()->contains(3) => true >>> User::all()->contains(4) => false
ブーリアン値を返すものには以下の空判定のメソッドもありますね。
>>> User::all()->isEmpty() => false >>> User::all()->isNotEmpty() => true
次の例はオブジェクトを返すメソッドです。
以下のように、最初と最後のレコードのオブジェクトを返すことが可能です。
>>> User::all()->first()
=> App\User {#4254
id: 1,
name: "坂本 充",
email: "nishida@example.net",
email_verified_at: "2021-05-30 21:55:14",
#password: "$2y$10$snEjTmJvBDu3uxd1bz0QDupihJA3zjvEH5J0pm/aLHG4UvpSfJe/q",
#remember_token: "j8hPjp8ob7",
birth_date: "1997-03-02",
created_at: "2021-05-30 21:55:14",
updated_at: "2021-05-30 21:55:14",
}
>>> User::all()->last()
=> App\User {#4260
id: 3,
name: "近藤 知実",
email: "atsushi.ito@example.net",
email_verified_at: "2021-05-30 21:55:14",
#password: "$2y$10$A7xldQvOiCfUOyNS57EEYu2/s77a70BPmGoOjzDSgTmveeRlcAD8.",
#remember_token: "qOFWQFb5ER",
birth_date: "1972-09-14",
created_at: "2021-05-30 21:55:14",
updated_at: "2021-05-30 21:55:14",
}
次回は、Collectionを返すメソッドを紹介します。
メルマガ購読の申し込みはこちらから。