Laravelで会社の価値観投稿機能を作成（0~６個）

#要件

プロフィールの一部として、価値観ページを作成する。
0~6個までの間で、任意の数投稿できる。
タイトル＋本文のみ。
タイトルは、カテゴリーと同じ（admin画面で簡単に登録・削除・編集できるようにする。）


![スクリーンショット 2021-09-13 9.46.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/620852/657ef046-f15c-435b-fe40-f89532ce4432.png)

#設計
中間テーブルを用意して、会社IDと本文とタイトルとする。
登録時に、6個だった場合に、制限をかける。

__Company_value(pivot)を作成__
__CompanyとCompany_valueにリレーションを組む__
__Viewに　投稿済み価値観編集フォーム＋価値観投稿フォーム__
__Controllerに、最大6つまでの制限をかける。__


##Company_value(pivot)を作成

```..bash
php artisan make:migration create_company_values_table --create=company_values
php artisan make:controller Enterprise/Company_valueController --model=Company_value
php artisan make:migration create_value_categories_table --create=value_categories
php artisan make:controller Enterprise/Value_categoryController --model=Value_category
```

```2021_09_12_112529_create_company_values_table.php
    public function up()
    {
        Schema::create('company_values', function (Blueprint $table) {
            $table->id();
            $table->integer('company_id');
            $table->string('title');
            $table->text('body');
            $table->timestamps();
        });
    }
```

```2021_09_13_011707_create_value_categories_table.php
    public function up()
    {
        Schema::create('value_categories', function (Blueprint $table) {
            $table->id();
            $table->string('title');
            $table->timestamps();
        });
    }
```

```..bash

php artisan migrate

```

##モデルにリレーションを組む

```Company.php
    public function company_values()
    {
      return $this->hasMany(Company_value::class);
    }
```

```Company_value.php
    public function company()
    {
      return $this->belongsTo(Company::class);
    }

    public function value_category()
    {
      return $this->belongsTo(Value_category::class);
    }
```

```Value_category.php
    public function company_values()
    {
      return $this->hasMany(Company_value::class);
    }
```

##Viewに　投稿済み価値観編集フォーム＋価値観投稿フォーム

```編集フォームblade.php
<p>編集部分（投稿済み）</p>
    @foreach ($company_values as $i => $company_value)
    <form action="{{ route('enterprise.companies.profile_update') }}" method="POST">
        {{ csrf_field() }}
        <p>No.{{$i+1}}</p>
        <select class="form-control" id="value_category" name="value_category_id" required>
            <option value="" hidden>▼価値観カテゴリー</option>
            @foreach($value_categories as $value_category)
                @if($company_value->value_category->id === $value_category->id )
                    <option value="{{ $value_category->id }}" selected>{{ $value_category->title }}</option>
                @else
                    <option value="{{ $value_category->id }}">{{ $value_category->title }}</option>
                @endif
            @endforeach
        </select>
        
        <textarea class="form-control" name="body" id="exampleFormControlTextarea1" rows="3">{{$company_value->body}}</textarea>

        <input type="hidden" name="company_value_id" value="{{ $company_value->id }}">
        <input type="submit" value="更新" class="t-btn">
    </form>
    <form action="{{ route('enterprise.companies.profile_destroy') }}" method="POST">
        {{ csrf_field() }}
        <input type="hidden" name="company_value_id" value="{{ $company_value->id }}">
        <input type="submit" value="削除" class="btn btn-danger post_del_btn" onclick="return confirm('削除しますか ?');">
    </form>
    @endforeach
```

```新規フォームblade.php
//６つ以上の価値観は作成できないように、フォームを非表示にする。
@if( count($company->company_values) < 6)
<p>新規投稿部分</p>
<form action="{{ route('enterprise.companies.profile_create') }}" method="POST">
    {{ csrf_field() }}
    <select class="form-control" id="value_category" name="value_category_id" required>
        <option value="" hidden>▼価値観カテゴリー</option>
        @foreach($value_categories as $value_category)
            <option value="{{ $value_category->id }}">{{ $value_category->title }}</option>
        @endforeach
        {{-- <option value="{{ $value_category->id }}" selected>{{ $value_category->title }}</option> --}}
    </select>
    
    <textarea class="form-control" name="body" id="exampleFormControlTextarea1" rows="3"></textarea>
    
    <input type="submit" value="登録" class="t-btn">
 </form>
 @endif
```

## Controllerに、最大6つまでの制限をかける。

```Company_valueController.php
class Company_valueController extends Controller
{
    public function profile_edit()
    {
        $companyId = session('company');
        $company = Company::find($companyId);

        $value_categories = Value_category::all();
        $company_values = $company->company_values;

        return view('enterprise.companies.profile_edit',compact('company','value_categories','company_values'));
    }

    public function profile_create(Request $request){

        $companyId = session('company');
        $company = Company::find($companyId);

        if( count($company->company_values) >= 6){
            return redirect()->back()->with('flash_message', '登録可能な価値観は最大６つまでです。');
        
        }else{
            $comapny_value = new Company_value();
            $comapny_value->company_id = $companyId;
            $comapny_value->value_category_id = $request->value_category_id;
            $comapny_value->body = $request->body;
            $comapny_value->save();

            return redirect()->back()->with('flash_message', '価値観を新規登録しました。');
        }
    }

    public function profile_update(Request $request){
        $companyId = session('company');
        $company = Company::find($companyId);

        $comapny_value = Company_value::find($request->company_value_id);
        $comapny_value->value_category_id = $request->value_category_id;
        $comapny_value->body = $request->body;
        $comapny_value->save();

        return redirect()->back()->with('flash_message', '価値観を更新しました。');

    }

    public function profile_destroy(Request $request){

        $comapny_value = Company_value::find($request->company_value_id);
        $comapny_value->delete();

        return redirect()->back()->with('flash_message', '削除しました。');

    }
   
}