商品追加機能の実装について【NULL】

<h1>はじめに</h1>
はじめまして！
webエンジニア転職を目指して三ヶ月が経ちました。
スクールでは共同開発が始まり、カート機能を実装しております。
そこで、終盤において商品追加機能を担当し、
復習&アウトプットも兼ねてご覧の皆さんに共有したいと思い、記事投稿に至ります！
至らぬ点が多々あるとは思いますが、何かの実装の参考になれば幸いです。😆


<h1>0,　目次</h1>
1,　概要
2,　環境
3,　参考テーブル
4, 【null値許容】の設定
参考にしたサイト

<h1>1,　概要</h1>
<h4>DB確認（Tinker）</h4>
本記事では、前回実装した商品データを元にDBへnull値も含めて追加していきたいと思います。
前回：[【Laravel】商品追加機能の実装について](https://qiita.com/nakasan773/items/d644e5675140632d852d)
今回：↓
・ <b>id:16</b> の商品を追加
・ null設定３箇所


![スクリーンショット 2021-04-29 23.48.55 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178769/3a8c0d58-0e2e-8e97-0ac5-65cd78072823.png)



<h1>2,　環境</h1>
macOS Big Sur 11.2.2　
Apache 2.4.46　
MySQL 5.7　
PHP 7.2.34
Laravel 5.8
　
実は今回、共同開発において
VirtualBoxを用いたVagrantによる仮想開発環境で統一したかったのですが、
投稿主のmacが最近出たばかりのM1チップが搭載されております。
そして、悲しいことに当時(2月中旬)はVirtualBoxなどバージョンが追いついておらず、
仕方なくAWS(Could9)での環境設定を余儀なくされました。。



<!--
<h2>4-① Controller</h2>

```php:NewAddController.php
<?php

namespace App\Http\Controllers;

use App\User;
use App\Models\Product;
use App\Models\Category;
use App\Models\ProductStatus;
use App\Models\Sale;
use Illuminate\Http\Request;
use App\Http\Requests\ProductRequests;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;

class AddController extends Controller
{
    public function index(Request $request)
    {
        return view('products.newAdd', [
            'user' => Auth::user(),
            'categories' => Category::all(),
            'products_status'  => ProductStatus::all(),
            'sales' => Sale::all(),
        ]);
    }

    
    public function store(ProductRequests $request)
    {
        $newProduct = new Product;
        $newProduct->product_name = $request->product_name;
        $newProduct->description = $request->description;
        $newProduct->price = $request->price;
        $newProduct->category_id = $request->category_id;
        $newProduct->product_status_id = $request->product_status_id;
        $newProduct->sale_status_id = $request->sale_status_id;
        $newProduct->user_id = Auth::user()->id;
        $newProduct->save();
        
        return view('welcome');
    }
}


```

-->

<h1>3,　参考テーブル</h1>
テーブルは事前に作ってあると思います。
今回の内容では、こちらのファイルの中身を変更する必要はありません。
カラム名など確認する際の参考として一応載せておきます。

```php:××××_××_××_××××××_create_m_products_table.php
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateMProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('m_products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('product_name', 64);
            $table->unsignedInteger('category_id');
            $table->integer('price');
            $table->string('description', 256);
            $table->unsignedInteger('sale_status_id');
            $table->unsignedInteger('product_status_id');
            $table->timestamp('regist_date');
            $table->unsignedInteger('user_id');
            $table->char('delete_flag', 1)->default(0);

            $table->foreign('user_id')->references('id')->on('m_users')->onDelete('cascade');
            $table->foreign('category_id')->references('id')->on('m_categories')->onDelete('cascade');
            $table->foreign('sale_status_id')->references('id')->on('m_sale_statuses')->onDelete('cascade');
            $table->foreign('product_status_id')->references('id')->on('m_product_statuses')->onDelete('cascade');
        });

    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('m_products');
    }
}

```




<h1>4,　【null値許容】の設定</h1>

```php
$ make:migration --table (作ったテーブル名) change_(作ったテーブル名)_table
Created Migration: ××××_××_××_××××××_change_m_products_table
```

これでchangeテーブルが作成されました。

ファイルを開いたら、
▶︎upメソッド
▶︎downメソッド
それぞれにnull許容(変更)の設定をしていきます。

```php:××××_××_××_××××××_change_m_products_table
<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class ChangeMProductsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('m_products', function (Blueprint $table) {

            // それぞれのカラムにNULLを許容
            $table->unsignedInteger('category_id')->nullable()->change();
            $table->unsignedInteger('sale_status_id')->nullable()->change();
            $table->unsignedInteger('product_status_id')->nullable()->change();
            
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('m_products', function (Blueprint $table) {
            
            //カラム削除
            $table->dropColumn(['category_id']);
            $table->dropColumn(['sale_status_id']);
            $table->dropColumn(['product_status_id']);
        });
    }
}

```

と、ここでエラーが出てくるかと思います。
こちらは別記事でまとめてます。
簡単に解決できますので、こちらを参考にしてみてください！↓
参考：[composer.jsonのエラーについて](https://qiita.com/nakasan773/items/0f864b7281e7fdbd9a8a)

以上でnull値としてDBに登録できたかと思います！



<h1>参考にしたサイト</h1>
•　 [Laravel 5.8 データベース：マイグレーション](https://readouble.com/laravel/5.8/ja/migrations.html)
•　 [LaravelのMigrateでカラムにNULLを許容したり許容しなかったり変更](https://qiita.com/igayamaguchi/items/0a452572b315ab5c8e86)
•　 [Laravel MySQL 既存カラムのNULL許容とデフォルト値をNULLに設定する](https://qiita.com/miriwo/items/55357235494e69e9e0f5)