0
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 1 year has passed since last update.

Laravelでフリータグ機能

Posted at

#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){
    // タグエリアをいきなり10個配置しているので、空で飛んでくる場合がある。
     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
:
:
0
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
0
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?