コメント機能 laravel


#マイグレーションファイルの作成

```
$ php artisan make:migration create_comments_table --create=comments
```

```comments_table.php
    public function up()
    {
        Schema::create('comments', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedInteger('article_id');
            $table->unsignedInteger('user_id');
            $table->text('content');
            $table->foreign('article_id')->references('id')->on('articles')->onDelete('cascade');
            $table->foreign('user_id')->references('id')->on('users');
            $table->timestamps();
        });
    }
```

#説明

符号なしINTカラム
コメントを postに紐付ける

```php
$table->unsignedInteger('article_id');
```

外部キー制約
foreign('article_id')
references('id')
どこの→idarticles


onDelete()
cascade→articleが削除された時に関連するコメントも一気に削除




#モデル作成

```
$ php artisan make:model　Comment
```

```Comment.php
<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Comment extends Model
{
    protected $fillable = ['content'];

    public function article()
    {
        return $this->belongsTo('App\Article', 'article_id');
    }

    public function user()
    {
        return $this->BelongsTo('App\User', 'user_id');
    }
}
```

```Article.php
//追加
    public function comments() {
        return $this->hasMany('App\Comment');
    }
```

#マイグレーション

```
$ php artisan migrate
```

#シーダーファイルの作成

```
$ php artisan make:seeder CommentsTableSeeder
```

```CommentsTableSeeder.php
public function run()
    {
        for ($i = 0; $i < 30; $i++) {
            $faker = Faker\Factory::create();

            $param = [
                'content' => $faker->paragraph(),
                'created_at' => Carbon::today(),
                'updated_at' => Carbon::today(),
                'article_id' => $faker->numberBetween(1, 10),
                'user_id' => $faker->numberBetween(1, 10),
            ];

            DB::table('comments')->insert($param);
        }
    }
```

#シーダーを実行する順番を追加
```DetabaseSeeder.php
//最後に追加
$this->call('CommentsTableSeeder');
```


#シーダーの実行
```
$ php artisan db:seed
```

#ルート

```web.php
Route::resource('comment', 'CommentsController', ['only' => ['']]);
```

#コントローラー
ファイルの作成

```
$ php artisan make:controller CommentsController
```

#view

```detail.php
    <div class="card w-50 mx-auto m-5">
        <div class="card-body">
            <div class="pt-2">
                <p class="text-muted font-weight-bold h4 border-bottom border-secondary pb-3">コメント</p>
            </div>
            @if($articles->comments->isNotEmpty())
                @foreach ($articles->comments as $comment)
                    <div class="border-bottom border-secondary pt-2">
                        <p class="text-muted mx-3 pt-1">{{ $comment->user->name }}
                            が{{ $comment->created_at->format('Y年n月j日') }}に投稿</p>
                        <p class="text-muted mx-3">{!! nl2br(e($comment->content)) !!}</p>
                    </div>
                @endforeach
                {{--            TODO:↓コメント入力欄、コメントボタンの設置--}}
            @else
                <p class="text-center pt-2">コメントはまだ投稿されていません。</p>
            @endif
        </div>
    </div>
    </div>
```

https://qiita.com/hththt/items/dd1f4a4ff4d98351f762