Laravelでフリータグ機能

#postにフリータグ機能を搭載したい。


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

```.bash

php artisan make:migration create_tags_table --create=tags

php artisan make:migration create_tag_posts_table --create=tag_posts

#php artisan make:migration マイグレーションファイル名 --create=テーブル名

```

##マイグレーションファイル編集

```maigration.php

        Schema::create('tags', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->integer('count');
            $table->timestamps();
        });


        Schema::create('tag_posts', function (Blueprint $table) {
            $table->id();
            $table->integer('post_id');
            $table->integer('tag_id');
            $table->timestamps();
        });

```

##php artisan migrate

```.bash

php artisan migrate

```


#Modelの記述（リレーションの記述）

###Post

```Post.php
:
:
  public function tags()
  {
    return $this->belongsToMany(Tag::class,'tag_posts');
  }
:
:
```

###Tag

```Tag.php
class Tag extends Model
{
    use HasFactory;

    protected $fillable = 
    [
        'name',
        'count'
    ];

    public function posts()
    {
      return $this->belongsToMany(Post::class,'tag_posts');
    }
}
```
###Tag_post

```Tag_post.php
class Tag_post extends Model
{
    use HasFactory;

    protected $fillable = 
    [
        'tag_id',
        'post_id'
    ];

}
```

###$fillableで何が出来る。

```$fillableなし.php
    $tag = new Tag();
    $tag->name = $request->name;
    $tag->count = $request->count;
    $tag->save();
```

```$fillableあり.php
    $tag = new Tag([
        'name' => $tag_request,
        'count' => 0,
    ]);
    $tag->save();
```

#View（データ送り方）

```balade.php
:
:
    @for ($i = 0; $i < 10; $i++)
         //name="array[0]"の記述で、$request->array[0]で格納される。
         <input type="text" name="tags[<?php $i; ?>]" placeholder="#タグを記入">
    @endfor
:
:
```

###$requestに投稿されたタグを配列形式で受け取れる。

```.bash

$request->tags

array(10)
0:null
1:"sdf"
2:null
3:null
4:null
5:"sdf"
6:"sdf"
7:null
8:null
9:null

(is_null($request->tags[0]))
true
(is_null($request->tags[6]))
false

```

#Controllerの記述方法

どのように保存するのか

```PostController.php

public function store(Request $request)
    {

    $post = new Post();

:
:

    //　post_idに紐付けるの、保存した後にタグの処理をする。
    $post->save();

    //$request->tags[0~9]で受け取っているので、foreachで格納
    //$fillableのおかげで、以下の保存記述ができる。
    foreach($request->tags as $tag_request){
    // タグエリアをいきなり１０個配置しているので、空で飛んでくる場合がある。
     if(!is_null($tag_request)){
        // 同じ名前のタグ名があれば、true処理のカウント追加をする。
        if((boolean) Tag::where('name',$tag_request)->first()){

            $tag = Tag::where('name',$tag_request)->first();
            $tag->count += 1;

        }else{

            $tag = new Tag([  
                'name' => $tag_request,
                'count' => 0,
            ]);
        }

        $tag->save();

    //tagを保存しつつ、中間テーブルも同時に作成して、紐付ける。
            $tag_post = new Tag_post([
                'tag_id' => $tag->id,
                'post_id' => $post->id,
            ]);
            $tag_post->save();
        }
    }
:
:
    }
```


#View(データの表示の仕方)

```detailblade.php
:
:       //多対多のメソッドで、呼び出せる。
        @foreach($post->tags as $tag)
            <div class="categories">
                {{ $tag->name }}
            </div>
        @endforeach
:
:
```