---
# System prepended metadata

title: Laravel - 資料庫設定

---

Laravel - 資料庫設定
===
---
### 建立資料庫
1. 使用cmd 建DB  
    ```linux
    mysql -u root 
    ```
    => 使用root登入mysql  

1. 建立專案用的資料庫  
    ```linux
    CREATE DATABASE 資料庫名稱;
    ```

1. 建立使用者帳號  
    ```linux
    CREATE USER 使用者帳號@localhost IDENTIFIED BY '使用者密碼';
    ```

1. 依照需要設定使用者權限  
    ```linux
    GRANT ALL PRIVILEGES ON laravel.* TO 使用者帳號@localhost;
    ```

1. 依照需求編輯專案目錄中的 .env 設定檔，填入 MySQL/MariaDB 資料庫的設定：  
    ```linux
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=資料庫名稱
    DB_USERNAME=使用者帳號
    DB_PASSWORD=使用者密碼
    ```
1. 重新php artisan serve 連線 (因為.env變動了)  

* 以上MySQL 部分，需遠端連結或開其他權限，參考以下連結：
    https://www.mysql.tw/2018/05/mysql.html  
    https://blog.xuite.net/towns/hc/65849335  
---
### 資料庫連結
1. 在 *.env* 設定環境
1. 在 *config/database.php* 找到 connnections 進行連結  

---
### 建立資料表
#### 建立資料庫結構(資料表)
範例為建 users 資料表（命名慣例使用 snake_case） 
 
1. 使用migration 建立資料表  
    ```linux
    php artisan make:migration create_users_table
    ```  
      

    也可以使用migration 建立資料表，同時建立model  
    ```linux
    php artisan make:model User --migration
    ```  
	* make:migration 資料表是user集合，用複數
	* make:model Model是指每一列資料，用單數  

1. 在migration 的function up(){ }設定users 資料結構（欄位內容）  
    ```php
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('title');
        $table->timestamps();
    });
    ```  
    * public function up(){ 這裡設定執行migrate 要做的事 新建這類 }
    * public function down(){ 這裡設定執行migrate:rollback 要做的事 刪除這類 }
    * 欄位變數型態或額外屬性設定 參考官網：  
    https://laravel.com/docs/6.x/migrations#columns
    
1. 執行migrate 建立資料庫  
    ```linux
    php artisan migrate
    ```
#### 復原資料庫結構  
* rollback 回到上一步 或指定退幾步  

    ```linux
     php artisan migrate:rollback
     php artisan migrate:rollback --step=5
    ```  
* fresh 清空資料庫後再執行每個migration 所以會有乾淨的資料表  

    ```linux
     php artisan migrate:fresh
     
    // Refresh the database and run all database seeds...
    php artisan migrate:refresh --seed
    
    // 清空後 再執行最後5步的migration
    php artisan migrate:refresh --step=5
    ```  
* reset 清空資料庫 所以只有一個空的資料庫  

    ```linux
     php artisan migrate:reset
    ```  
    
#### 其他 migration 動作指令
* rollback、reset、refresh...  
直接看[官網](https://laravel.com/docs/6.x/migrations#running-migrations)

---
### 修改資料表
#### 修改資料表名  

* 建立一個migration 在up() 寫入以下內容 然後執行migrate  
    （down() 就把$from $to 對調就好）  

    ```php
    Schema::rename($from,$to);
    ```

#### 欄位異動  
* 前置動作  

    在修改前，需要先在*composer.json* 加入doctrine/dbal 的相依性  
    （官網寫的；有時間測試一下沒執行這個動作會怎樣...）
    ```linux
    composer require doctrine/dbal
    ```


* 寫異動欄位的migration  

    用 動作_to_表名 就會在migration 自動代入table的部分
    ```linux
    php artisan make:migration add_gender_to_uers

    // 我覺得以下寫法雖然比較長 但更清楚這個migration 的目的
    php artisan make:migration add_column_gender_to_uers_table
    ```  
    或是在指令中 指定table （但這樣比較不清楚這個migration 目的）
    ```linux
    php artisan make:migration add_column_users --table=users
    ```  
    
    檢查 add_column_us_to_us_table 這個migration 就會看到自動代入Schema::table()的部分
    如果migration 名稱用很free 的寫法，那就要自己寫這段
    ```php
    class AddColumnGenderToUersTable extends Migration
    {
        /**
         * Run the migrations.
         *
         * @return void
         */
        public function up()
        {
            // 有指定資料表就會帶出這3行
            Schema::table('uers', function (Blueprint $table) {
                //
            });
        }

        /**
         * Reverse the migrations.
         *
         * @return void
         */
        public function down()
        {
            // 有指定資料表就會帶出這3行
            Schema::table('uers', function (Blueprint $table) {
                //
            });
        }
    }
    ```
    * 新增欄位 （就上面的範例）  
    
        ```php
        public function up()
        {
            Schema::table('users', function (Blueprint $table) {
              $table->string('gender');
            });
        }

        public function down()
        {
            Schema::table('users', function (Blueprint $table) {
              $table->dropColumn('gender');
            });
        }
        ```
    * 修改欄位屬性 在新指定的屬性後面加->change()  
        ```php
        Schema::table('users', function (Blueprint $table) {
            $table->string('name', 50)->change();
        });
        
        Schema::table('users', function (Blueprint $table) {
            $table->string('name', 50)->nullable()->change();
        });
        ```
    * 重新命名欄位 （那個相依性套件就是用在這裡）
        ```php
        Schema::table('users', function (Blueprint $table) {
            $table->renameColumn('from', 'to');
        });
        ```
    * 刪除欄位  
        ```php
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('votes');
        });
        
        // 同時刪除多筆欄位
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn(['votes', 'avatar', 'location']);
        });
        ```
---
* 補充：出現錯誤代碼 **SQLSTATE[HY000] [1049]** 若*config/database.php* 、*.env* 都沒問題，那可能是需要清cache

    ```linux
    D:\cat_shop_laravel>php artisan config:cache    
    Configuration cache cleared!
    Configuration cached successfully!
    ```