1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【初心者向け】LaravelでYoutubeのお気に入りCuration(まとめ)アプリを作る【第2回: MySQLに接続】

Last updated at Posted at 2021-10-02

こんにちは。
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を開いてみましょう。

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を見てみましょう。

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が作成されます。

作成されたファイルに下記を記述しましょう。

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()の中に、コメントがあると思うので、それを有効にします。

DatabaseSeeder.php
    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】

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?