#リレーションの定義
##リレーション3パターン
###1対1
一つのモデルが一つのモデルと関係を持つタイプです。
###1対多
一つのモデルが多くのモデルを持つタイプです。
###多対多
三つ以上のモデルが存在し、それぞれが関係を持つタイプです。
##多対多で、タグをボタン選択式にして実装
今回のタグ付けには、多対多を使用します。
まず、recommendsテーブルとtagsテーブルを関連付けるためのrecommend_tagテーブルを作成します。
$ php artisan make:migration create_recommend_tag_table
次に、作成した create_recommend_tag_table を以下の内容に編集します。
recommend/database/migrations/2020_09_26_103413_create_recommend_tag_table.php
public function up()
{
Schema::create('recommend_tag', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('recomend_id');
$table->unsignedBigInteger('tag_id');
});
}
recommend/app/Models/Recommend.php
class Recommend extends Model
{
protected $fillable = [
'title',
'image_file_name',
'image_title',
'url',
'description',
'Impressions'
];
//リレーション
public function tags()
{
return $this->belongsToMany(tag::class);
}
}
recommend/app/Models/Tag.php
class Recommend extends Model
{
class Tag extends Model
{
protected $fillable = [
'title',
];
//リレーション
public function recommend()
{
return $this->belongsToMany(Recommend::class);
}
}
recommendと連帯した表示をさせるため、コントローラにtagモデルを設定します。
recommend/app/Http/Controllers/RecommendController.php
use App\Models\Recommend;
use App\Models\Tag;
// use Illuminate\Http\Request;
use App\Http\Requests\RecommendPostRequest;
recommendコントローラーにtagを渡します。
recommend/app/Http/Controllers/RecommendController.php
public function create()
{
$tags = Tag::all();
return view('recommends.create', compact('tags'));
}
public function edit(Recommend $recommend)
{
$tags = Tag::all();
return view('recommends.edit', compact('recommend', 'tags'));
}
recommendのeditとcreateにtagをforeachで組み込み
recommend/resources/views/recommends/create.blade.php
@foreach($tags as $tag)
<th>
<input type="checkbox" name="tag">{{$tag->title}}
</th>
@endforeach