Laravel で Ruby on Rails チュートリアル【6章】モデル

## 環境
- Laravel 8.6
- PHP 8.0
- Bootstrap 5.1

## 6.1 Userモデル

### 6.1.1 データベースの移行

既存のUserモデル、create_users_tableマイグレーションを流用する

```php:/database/migrations/[timestamp]_create_users_table.php
class CreateUsersTable extends Migration
{
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('users');
    }
}
```

マイグレーション適用

```bash
sail artisan migrate
```

### 6.1.2 modelファイル

```php:/app/Models/User.php
class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable;

    protected $fillable = [
        'name',
        'email',
        'password',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
}
```

### 6.1.3 ユーザーオブジェクトを作成する

```php
$user = new User; // オブジェクト作成
$user->name = "Michael Hartl"; // 名前を代入
$user->email = "mhartl@example.com"; // メールアドレスを代入
$user->save(); // DBに保存

$foo = User::create(['name' => "A Nother", 'email' => "another@example.org"]); // 配列で属性を指定
$foo->delete(); // DBから削除
```

### 6.1.4 ユーザーオブジェクトを検索する

```php
User::find(1); // id=1 のユーザーを返す
User::where('email', "mhartl@example.com"); // メールアドレスがmhartl@example.comのユーザーを検索
User::first(); // 一番最初のユーザーを返す
User::all(); // 全てのユーザーを返す
```

### 6.1.5 ユーザーオブジェクトを更新する

```php
$user = User::find(1); // id=1のユーザーを返す

$user->email = "mhartl@example.com"; // メールアドレスを設定
$user->save(); // DBに保存

$user->update(["name" => "The Dude", "email" => "dude@abides.org"]); // カラムを指定した値に変更
```

# 6.2 ユーザーを検証する

### 6.2.1 有効性を検証する

### 6.2.2 存在性を検証する

```php:/app/Http/Controllers/UsersController.php
    public function store(Request $request)
    {
        $request->validate([
            "name" => "required",
            "email" => "required"
        ]);
    }
```

### 6.2.3 長さを検証する

```php:/app/Http/Controllers/UsersController.php
    public function store(Request $request)
    {
        $request->validate([
            "name"  => "required|max:50",
            "email" => "required|max:255",
        ]);
    }
```

### 6.2.4 フォーマットを検証する

```php:/app/Http/Controllers/UsersController.php
    public function store(Request $request)
    {
        $request->validate([
            "name"  => "required|max:50",
            "email" => "required|max:255|email",
        ]);
    }
```

### 6.2.5 一意性を検証する

```php:/app/Http/Controllers/UsersController.php
    public function store(Request $request)
    {
        $request->validate([
            "name"  => "required|max:50",
            "email" => "required|max:255|email|unique:users|email",
        ]);
    }
```

ユニークインデックス追加

```bash
sail artisan make:migration add_email_index_to_users
```
```php:/database/migrations/[timestamp]_add_index_to_users_email.php
class AddIndexToUsersEmail extends Migration
{
    public function up()
    {
        Schema::table('users_email', function (Blueprint $table) {
            $table->unique('email');
        });
    }

    public function down()
    {
        Schema::table('users_email', function (Blueprint $table) {
            $table->dropUnique('users_email_unique');
        });
    }
}
```

## 6.3 セキュアなパスワードを追加する

### 6.3.1 ハッシュ化されたパスワード

カラム追加

```bash
sail artisan make:migration add_password_to_users
```
```php:/database/migrations/[timeatamp]_add_password_to_users.php
class AddPasswordToUsers extends Migration
{
    public function up()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->string('password')->after('email');
            $table->rememberToken()->after('password');
        });
    }

    public function down()
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('password');
            $table->dropRememberToken();
        });
    }
}
```

### 6.3.2 ユーザーがセキュアなパスワードを持っている

```php:/app/Http/Controllers/UsersController.php
    public function store(Request $request)
    {
        $request->validate([
            "name"     => "required|max:50",
            "email"    => "required|max:255|email|unique:users|email",
            "password" => "required|confirmed",
        ]);
    }
```

### 6.3.3 パスワードの最小文字数

```php:/app/Models/User.php
    public function store(Request $request)
    {
        $request->validate([
            "name"     => "required|max:50",
            "email"    => "required|max:255|email|unique:users|email",
            "password" => "required|confirmed|min:6",
        ]);
    }
```

### 6.3.4 ユーザーの作成と認証

tinkerでユーザを作成

```php
User::create(["name" => "Michael Hartl", "email" => "mhartl@example.com", "password" => bcrypt("foobar")]);
```

## 6.4 最後に

#### 参考
https://qiita.com/kd9951/items/c06d107aa4018295aa25