iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 18
1

完成 user 的 API 後,接下來就來建立貼文的 API,而貼文的 API 就是符合典型的 RESTful 的所有標準 (含 index、show、store、update、destroy )。

建立 migration

之前 user 的部份有稍微介紹過 migration,但這次是從無開始的情形,因此就來詳細解釋每個步驟。

首先透過 php artisan 建立貼文的 migration ( 資料表名稱預設為 posts )

$ php artisan make:migration create_posts_table

除了上述指令之外,另外還可以自定義以下方式 :

  • 自定義建立的資料表名稱

    $ php artisan make:migration create_posts_table --create=[table_name]
    
  • 指定某個已經存在的資料表 ( 以便只針對欄位做變動的動作 )

    $ php artisan make:migration create_posts_table --table=[table_name]
    

完成之後的 migration 檔案為以下結果:

*YYYY_MM_DD_XXXXXX_create_posts_table.php

    <?php

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

    class CreatePostsTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            Schema::create('posts', function (Blueprint $table) {
                $table->bigIncrements('id');
                $table->timestamps();
            });
        }

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

添加資料表欄位

貼文的部份大致上除了涵蓋主題、內文之外,還有 user_id ( users 和 posts 之間為一對多的關係 ),除了建立主題與內文的欄位外,也可建立 user 的 foregin key 以便建立 users 和 posts 之間的關聯性 ( 視情況決定 )。

舉例:在某個電商網站中,若某個賣家有產品在線上,但若該賣家刪除了自己的帳號,那麼那些屬於本人的產品應該也要同時刪除才合理,否則可能會引來不必要的麻煩,因此 foreign key 有其存在的必要性。

*YYYY_MM_DD_XXXXXX_create_posts_table.php

    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->bigIncrements('id');

            // 建立 user_id 的欄位
            $table->unsignedBigInteger('user_id');
            
            // 建立主題與內文的欄位
            $table->string('title');
            $table->string('content');

            // 建立 user_id 的 foreign key
            $table->foreign('user_id')->references('id')->on('users');

            $table->timestamps();
        });
    }

執行 migration

設計完 post 的資料表後,接下來就將它遷移至自己的資料庫裡頭

$ php artisan migrate

除此之外,若曾經做過資料表遷移,但又要更動 migration 時,在編輯完 migration 的檔案後,可以執行以下指令:

1. 推回上一次的 migration

$ php artisan migrate:rollback

或者推回上幾次的 migration

$ php artisan migrate:rollback --step=5

甚至是推回所有的 migration

$ php artisan migrate:reset

2. 重新執行 migration

$ php artisan migrate

而1跟2的步驟可以用一個指令取代

// Rollback all your migrations and execute the migration command
$ php artisan migrate:refresh

或者

// Rollback limited migration and execute the migration command
$ php artisan migrate:refresh --step=[number]

< 補充 > migrate:fresh 為直接刪除所有資料表後再做遷移的動作。

確認資料表有確實寫入之後,下一篇就來設計貼文的model。

參考資料:

  1. Migrations : https://laravel.com/docs/6.x/migrations
  2. Are foreign keys really necessary in a database design? : https://stackoverflow.com/questions/18717/are-foreign-keys-really-necessary-in-a-database-design

上一篇
Day 17 : 用 Middleware 管理權限 ( part II )
下一篇
Day 19 : 貼文 ( Model ) [ 遇到一個坑 > < ]
系列文
從零開始的Laravel RESTful api30

尚未有邦友留言

立即登入留言