Laravelチートシート(自分用)

### プロジェクト作成

```php
composer create-project laravel/laravel プロジェクト名
```

**Dockerの場合**

```php
curl -s "https://laravel.build/プロジェクト名?with=mysql,mailpit" | bash
```

### サーバー立ち上げ

```php
php artisan serve
```

```php
sail up -d      
```

### サーバーダウン

```php
sail down
```

### Modelの作成

```php(マイグレーションファイルも一緒に作る)
php artisan make:model モデル名 --migration
```

**Dockerの場合(マイグレーションファイルも一緒に作る)**

```php
sail artisan make:model モデル名 --migration
```

### マイグレーションファイルの作成及びカラムの追加

```php
php artisan make:migration マイグレーションファイル名
```

**Dockerの場合**

```php
sail artisan make:migration マイグレーションファイル名
```
#### カラム追加
データ型一覧
https://qiita.com/Otake_M/items/3c761e1a5e65b04c6c0e
https://qiita.com/Takahiro_Nago/items/51eb0e9f1c8bbc2c9852
increments('id') ... 「符号なしINT」を使用した自動増分ID（主キー）
binary('カラム名') ... バイナリデータカラム
boolean('カラム名') ... 真偽値カラム
char('カラム名', 長さ) ... 長さを指定する文字列カラム
date('カラム名') ... 日付カラム
time('カラム名') ... 時間カラム
dateTime(カラム名) ... 日時カラム
double('カラム名', 桁数, 小数点以下桁数) ... ○桁で小数点以下×桁の小数カラム
enum('カラム名', ['定数', '定数']) ... ENUMカラム
integer('カラム名') ... 数値データカラム
json('カラム名') ... JSONフィールドカラム
timestamp('カラム名') ... TIMESTAMPカラム
timestamps() ... created_atとupdate_atカラム
nullableTimestamps() ... NULL値を許す以外、timestamps()と同じ
string('カラム名') ... VARCHARカラム
string('カラム名', 長さ) ... 長さ指定のVARCHARカラム
text('カラム名') ... TEXTカラム

```
$table->データ型('カラム名');
```
```
$table->string('title');
$table->string('image');
$table->text('body');
$table->timestamps(); // `created_at`と`updated_at`を追加
```

### テーブル名変更
https://satoru103.hatenablog.com/entry/2021/01/05/205853

### migrate実行

```php
php artisan migrate
```

**Dockerの場合**

```php
sail artisan migrate
```

### コントローラー作成(頭文字は大文字)

```php
php artisan make:controller コントローラ名Controller 
```

**7つのアクション(index,store,create,show,edit,update,destroy)を使いたい時は以下のコマンド**

```php
sail artisan make:controller コントローラー名Controller -r
```

### DB取得

https://zenn.dev/makino/articles/ee1b0a832ebad3

### controllerアクション名

```php
public function アクション名()
	{
		処理
	}
```

https://kinsta.com/jp/blog/laravel-crud/

https://qiita.com/isaatsu0131/items/72a987f0be8001e7d2cb

### routesの設定

```php
Route::get('パス',[コントローラー名::class, 'アクション名']);
```

```php
Route::get('/users/{id}',[RequestSampleController::class, 'profile'])->name(name:'profile');
```

**resourcesを使う場合**

```php
Route::resource('パス', コントローラー名::class)-> only(['使うアクション名']);
```

```php
Route::resource('/events', EventController::class)-> only(['index', 'create', 'store']);
```

### Httpメソッドの種類
HTTPメソッド	CRUD
GET	Read。レコード取得
POST	Create。レコード新規作成
PUT	Update。レコード更新
DELETE	Delete。レコード削除
https://qiita.com/oouaioi/items/aec09289e49d87b7ed61

### viewでPHPを書く場合

**表示する時**

```php
{{$title}}
```

表示させない場合

```php
@if

@endif
```

### バリデーション
ルール一覧
https://qiita.com/fagai/items/9904409d3703ef6f79a2
https://appdev-room.com/php-laravel-validation-rule
```php
php artisan make:request バリデーション名
```

**Dockerの場合**

```php
sail artisan make:request バリデーション名Request
```

例

```php
sail artisan make:request BlogRequest
```

2.authorizeメソッドのreturnを<font color="Red">true</font>に変更

3.rulesメソッドにバリデーションを記述

```php
 public function rules(): array
    {
        return [
            'name' => ['required', 'string', 'max:255'],
            'name_kana' => ['required', 'string', 'max:255', 'regex:/^[ァ-ロワンヴー]*$/u'],
            'phone' => ['nullable', 'regex:/^0(\d-?\d{4}|\d{2}-?\d{3}|\d{3}-?\d{2}|\d{4}-?\d|\d0-?\d{4})-?\d{4}$/'],
            'email' => ['required', 'email'],
            'body' => ['required', 'string', 'max:2000'],
        ];
    }
```

4.controllerにuse文を追加

```php
use App\Http\Requests\BlogRequest;
```

5.モデルに`$fillable`プロパティを追記

```php
protected $fillable = [
        'title', 
        'body'
    ];
```
### バリデーションメッセージ日本語化
1..envのAPP_LOCALEをjaに変更
2.以下のgithubにアクセス
https://github.com/Laravel-Lang/lang/tree/10.9.5
3.ダウンロード後にファイルのlocalesをクリックしてjaを選択
4.langというディレクトリを作りその中にファイルをドラッグしてコピーする
5.追加したい時はvalidation.phpに以下のようにattributesを使って追加する
```
'attributes' => [
        'name' => '名前',
        'name_kana' => '名前(フリガナ)',
        'phone' => '電話番号',
        'email' => 'メールアドレス',
        'body' => '本文'
    ]
```

### エラー表示

```

  @if ($errors->any())
    <div>
        <ul>
            @foreach($errors->all() as $error)
                <li>{{ $error }}</li>
            @endforeach
        </ul>
    </div>
@endif
```

### リンクボタン

```php
<a href="{{ route('blogs.create') }}">ブログ投稿</a> 
```

### 入力フォーム
<font color='red'>画像を送信しない時はenctype="multipart/form-data"を消す
```
<form action="{{ route('content')}}" method="post" enctype="multipart/form-data">
    @csrf
    <label for="phone_label" class="phone_label">電話番号</label>
    <input id="phone_number" class="phone_number" type="text" placeholder="例）0312345678" name="phone" >
    <button type="submit">送信</button>
</form>
```

### メールの自動送信(Mailableで作る)
https://zenn.dev/nshiro/articles/adcbc2e127f712

### メッセージ付きリダイレクト
```
return to_route('admin.blogs.index')->with('success', 'ブログを投稿しました');
```

### リレーション(1対多 usersテーブルとblogsテーブルの場合)
1.マイグレーションファイルを準備し、外部キーをセットする
```
Schema::create('blogs', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id'); // 外部キー用のカラム
            $table->string('title');
            $table->text('content');
            $table->timestamps();

            // 外部キー制約を追加
            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        });
```
2.migrateを実行する
3.Blogモデルの作成: 以下のコマンドでBlogモデルを作成します。
```
php artisan make:model Blog
```
3.親モデルにhasManyを書く(今回の場合はUser.php)
```
public function blogs()
{
    return $this->hasMany(Blog::class);
}
```
4.子モデルにbelongsToを書く(今回の場合はBlog.php)
```
public function user()
{
    return $this->belongsTo(User::class);
}
```

### リレーション(多対多 usersテーブルとblogsテーブルの間にfavoritesテーブルを作る場合)
1.マイグレーションファイルの準備 中間テーブル用のマイグレーションファイルを作成します。
```
php artisan make:migration create_favorites_table
```
2.中間テーブルのマイグレーション設定 作成したマイグレーションファイルを以下のように編集します。
```
Schema::create('favorites', function (Blueprint $table) {
    $table->id();
    $table->unsignedBigInteger('user_id'); // 外部キー
    $table->unsignedBigInteger('blog_id'); // 外部キー
    $table->timestamps();

    // 外部キー制約を追加
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('blog_id')->references('id')->on('blogs')->onDelete('cascade');

    // ユニーク制約を追加（同じユーザーとブログの組み合わせを防ぐ）
    $table->unique(['user_id', 'blog_id']);
});
```
3.マイグレーションの実行
4.UserモデルにbelongsToManyを書く User.phpモデルに以下を追加します。
```
public function favorites()
{
    return $this->belongsToMany(Blog::class, 'favorites');
}
```
5.BlogモデルにbelongsToManyを書く Blog.phpモデルに以下を追加します。
```
public function users()
{
    return $this->belongsToMany(User::class, 'favorites');
}
```