#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
:
: