こんにちは。
ITエンジニアの濱辺(ハマベ)です。
前回に引き続き、お気に入りの動画を共有できる、SNSのようなアプリを作っていきます。
今回は、MySQLにデータ登録できるようにするところまでやっていきます。
前提条件
MacOS 11.2
PHP 7.4.2
Laravel 6.20.34
Docker
MySQL
↓第一回はこちら
LaravelでYoutubeのお気に入りCuration(まとめ)アプリを作る【第1回】
↓こちらの画面定義書のものを作っていきます。
Youtube-Curation 画面定義所 (googleスプレッドシート)
Model構築
まずはMVCモデルの「M」Modelを作っていきます。
MVCモデルとは
今回のアプリケーションでは、主に下記の2種類のモデルが登場します。
- ユーザ(利用者)モデル
- ムービー(動画)モデル
まずは、ユーザモデルを構築していきます。
このアプリはいろいろなユーザさんが利用されることを想定して作ります。
なので、大量のユーザの名前・メールアドレスなどをデータベース上に保存する必要があります。
そのユーザ情報を保存するに当たって肝心なのが、ユーザモデルです。
ログインに使用する情報なので、しっかり作らないとサービスが成り立ちません。
重要な項目なので、しっかり確認しながら作っていきましょう。
最大文字数の制限設定
app/Providers/AppServiceProvider.php
を開きましょう。
bootという関数の中身に以下を追記します。
public function boot()
{
\Schema::defaultStringLength(191); //追記
}
DBにMySQLを選択した場合、(バージョンにもよるが)最大文字数を191以内にしないとマイグレーション時にエラーしてしまいます。
マイグレーション実行
データベースとあなたのプロジェクトを全く同じ構造で作成しないと、それぞれが上手く動作しなくなります。
そこで便利なのが、マイグレーション機能です。
マイグレーションファイルと呼ばれるファイルを作成してマイグレーションを実行することで、
マイグレーションファイルに書かれたテーブルの定義がMySQLなどのデータベースに反映されるのです。
また、マイグレーションファイルは履歴として残るので、やっぱり昨日の状態に戻したい…。といった時に、それが可能になります。
ユーザテーブルのマイグレーション
ユーザテーブルのマイグレーションファイルは、実はLaravelに標準として備わっています。すでに、あなたがDLしたLaravelに存在するのです。
database/migrations/2014_10_12_000000_create_users_table.php
を開いてみましょう。
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('name');
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
});
}
上記のようなコードが書かれているはずです。
$table->string('name');
はString(文字列)型のnameというカラムを作れ、という司令です。他のコードもほとんど似たような意味です。
マイグレーションファイルについて詳しくはこちら
では、早速マイグレーションを実行してみましょう。
下記コマンドを実行してみてください。
% docker-compose exec app bash //コンテナに入る
# php artisan migrate
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table (0.05 seconds)
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table (0.04 seconds)
Migrating: 2019_08_19_000000_create_failed_jobs_table
Migrated: 2019_08_19_000000_create_failed_jobs_table (0.02 seconds)
ユーザテーブルの実行と同時に実行される、create_password_resets_tableというのは
パスワードリセット用のマイグレーションファイルです。
試しにユーザ登録してみよう
Userモデルは、Laravelに標準で用意されています。
app/User.php
を見てみましょう。
class User extends Authenticatable
{
use Notifiable;
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'name', 'email', 'password',
];
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
細かな点は省きますが、$fillable
に入っている要素(今回はname,email,password)を登録できるようになっています。
また、$hidden
は、表示するべきではないデータを隠すために使われます。試しにtinkerでユーザ登録してみます。
# php artisan tinker
>>> use App\User
>>> User::create([
... 'name' => 'sample',
... 'email' => 'sample@email.com',
... 'password' => bcrypt('sample')])
=> App\User {#4188
name: "sample",
email: "sample@email.com",
#password: "$2y$10$ltbjNuCqv143BqpAisENpe22KlIAvPdDfCRUBKzbqJOiIHKeCU1wi",
updated_at: "2021-10-02 03:46:26",
created_at: "2021-10-02 03:46:26",
id: 1,
}
>>> $user = User::find(1)
=> App\User {#3306
id: 1,
name: "sample",
email: "sample@email.com",
email_verified_at: null,
#password: "$2y$10$ltbjNuCqv143BqpAisENpe22KlIAvPdDfCRUBKzbqJOiIHKeCU1wi",
#remember_token: null,
created_at: "2021-10-02 03:46:26",
updated_at: "2021-10-02 03:46:26",
}
#password と #remember_tokenについている'#'は、rootユーザにしか表示されないことを表しています。
今回作成したデータは必要ないので、削除しておきます。
>>> $user->delete()
=> true
>>> $user=User::find(1)
=> null
シーディングで一括データ登録
データを一つずつ登録するのは手間なので、「シーディング」で一括登録できるようにします。
# php artisan make:seeder UsersTableSeeder
Seeder created successfully.
すると、database/seeds/UsersTableSeeder.php
が作成されます。
作成されたファイルに下記を記述しましょう。
public function run()
{
//以下を追記
DB::table('users')->insert([
'name' => 'sample1',
'email' => 'sample1@sample.com',
'password' => bcrypt('sample1')
]);
DB::table('users')->insert([
'name' => 'sample2',
'email' => 'sample2@sample.com',
'password' => bcrypt('sample2')
]);
DB::table('users')->insert([
'name' => 'sample3',
'email' => 'sample3@sample.com',
'password' => bcrypt('sample3')
]);
DB::table('users')->insert([
'name' => 'sample4',
'email' => 'sample4@sample.com',
'password' => bcrypt('sample4')
]);
DB::table('users')->insert([
'name' => 'sample5',
'email' => 'sample5@sample.com',
'password' => bcrypt('sample5')
]);
}
また、同フォルダの中にある、DatabaseSeeder
を見てみましょう。
関数public function run()
の中に、コメントがあると思うので、それを有効にします。
public function run()
{
$this->call(UsersTableSeeder::class);
}
では、seederを実行してみます。
# php artisan db:seed --class=UsersTableSeeder
Database seeding completed successfully.
tinkerを使って、ちゃんと登録されているか見てみましょう。
>>> use App\User
>>> User::all()
=> Illuminate\Database\Eloquent\Collection {#3623
all: [
App\User {#3991
id: 1,
name: "sample1",
email: "sample1@sample.com",
email_verified_at: null,
#password: "$2y$10$UPYeRAW10Mawq/tg1Ao/geKAUMkFHJhQofo1NZQsbSqkbX50PZZx6",
#remember_token: null,
created_at: null,
updated_at: null,
},
App\User {#4238
id: 2,
name: "sample2",
email: "sample2@sample.com",
email_verified_at: null,
#password: "$2y$10$vhJywRf0mJmQl9ijLwQQau/1myd5lZITTrm4gUSzVvLrYO8aCkx1S",
#remember_token: null,
created_at: null,
updated_at: null,
},
App\User {#4239
id: 3,
name: "sample3",
email: "sample3@sample.com",
email_verified_at: null,
#password: "$2y$10$8GQtzkSyWlIjnUXNpNC4HeEsRmJjaZXkaG14Y9QTZXIYlyDsvrr0e",
#remember_token: null,
created_at: null,
updated_at: null,
},
App\User {#4240
id: 4,
name: "sample4",
email: "sample4@sample.com",
email_verified_at: null,
#password: "$2y$10$PuQvQrd9bJBK9H.Tt5oud.AAldX.97vuaY12ObOGW4vK1u.fYvWxu",
#remember_token: null,
created_at: null,
updated_at: null,
},
App\User {#4241
id: 5,
name: "sample5",
email: "sample5@sample.com",
email_verified_at: null,
#password: "$2y$10$5iPPlCY1mMqh64gDBCKzteUehlVPT4Yxw3.2Sr.Iy92vK.JxoSg6C",
#remember_token: null,
created_at: null,
updated_at: null,
},
],
}
ユーザ登録が実行されていることが確認できました。
第2回おわり
前後編くらいで終わるかな、と思ったのですが、結構長くなりそう…😅
第3回は、新規ユーザ登録機能を実装していきます😄
↓第3回はこちら
LaravelでYoutubeのお気に入りCuration(まとめ)アプリを作る【第3回: Laravel】