---
# System prepended metadata

title: laravel migrate
tags: [Laravel]

---

#  laravel migrate 



## 即使在遷移時設置了默認值，批量分配也不會處理空輸入
https://stackoverflow.com/questions/56353195/mass-assignment-wont-handle-null-input-even-when-default-is-set-on-migration-an



## Laravel 7+ 的外键
从 Laravel 7 开始，你不需要在迁移（migration）中为一些关系字段写两行代码 —— 一行是字段，一行是外键。你可以使用 foreignId() 方法。

```
// Laravel 7 之前
Schema::table('posts', function (Blueprint $table)) {
    $table->unsignedBigInteger('user_id');
    $table->foreign('user_id')->references('id')->on('users');
}

// 从 Laravel 7 开始
Schema::table('posts', function (Blueprint $table)) {
    $table->foreignId('user_id')->constrained();
}

// 或者你的字段不同于表中的引用的
Schema::table('posts', function (Blueprint $table)) {
    $table->foreignId('created_by_id')->constrained('users', 'column');
}
```

## 組合key
![](https://i.imgur.com/JS4wJpU.png)
laravel unique array是組合key
他不是分開兩個建立

## primary
![](https://i.imgur.com/C7r2QO3.png)
多態primary常用
![](https://i.imgur.com/eThRGWc.png)


## 外key也是index

## 常遇到錯誤
當表錯誤
rollback
還是會說表存在
解決方法
刪除那個表

在我寫的控制台中 php artisan tinker

然後，再次在控制台中， Schema::drop('users')

最後php artisan migrate，一切都奏效了。

## unique
unique 也會建立index

`$table->string('email')->unique();`
此外，你可以在定義完欄位之後建立索引。例如：

`$table->unique('email');`
你也可以傳遞一個欄位的陣列至索引方法來建立複合索引：

`$table->index(['account_id', 'created_at']);`
但可能會爆開(name沒這麼長)
因為index會需要一個名稱
所以$table->unique(['email','good'])
這樣她會自動把兩個加起來
解決辦法
幫他設一個名稱就好了
https://laraveldaily.com/migration-index-too-long-choose-the-name-yourself/

##  外key約束
ON DELETE
restrict(約束):當在父表（即外來鍵的來源表）中刪除對應記錄時，首先檢查該記錄是否有對應外來鍵，如果有則不允許刪除。

no action:意思同restrict.即如果存在從資料，不允許刪除主資料。

cascade(級聯):當在父表（即外來鍵的來源表）中刪除對應記錄時，首先檢查該記錄是否有對應外來鍵，如果有則也刪除外來鍵在子表（即包含外來鍵的表）中的記錄。

set null:當在父表（即外來鍵的來源表）中刪除對應記錄時，首先檢查該記錄是否有對應外來鍵，如果有則設定子表中該外來鍵值為null（不過這就要求該外來鍵允許取null）

## forgin key失敗 修正之後alreay
https://www.youtube.com/watch?v=DWzUBpsEEHY
第一個常用 刪除表 重跑

第二個 改成table
![](https://i.imgur.com/Bzokyop.png)


## after before
只有在mysql

```
Schema::table('users', function (Blueprint $table) {
    $table->string('phone')->after('email');
});
```


```
Schema::table('users', function (Blueprint $table) {
    $table->string('phone')->before('created_at');
});
```


```
Schema::table('users', function (Blueprint $table) {
    $table->string('uuid')->first();
});
```


## unsigned()
小心，unsigned()!
(2) 『當外鍵有參照到自動增量時，記得設定外鍵為 unsigned 型態。』- from http://laravel.tw/docs/4.2/schema
這句話的意思是，如果某張表的 key 是參考到另一張表的鍵而且是 auto_increment 時，要記得將那個外鍵設定為 unsigned()

範例，假這個 id 會在別的 table 某欄位參考到，那麼就要記得 unsigned:
$table->increments('id')->unsigned();

**表有更動都要composer dump-autoload**
## 建表的雷 

請先建立沒有外key的
錯了還是會建立表格 可以手動刪除或跑指令

先刪除外key(技術長說不用)
![](https://i.imgur.com/lZdYRtH.png)

## 外key可以用array

![](https://i.imgur.com/ApUsiYL.png)


##  實用技巧

https://www.youtube.com/watch?v=bSQcmcu6yHc

**第一**
id 預設big 不然就把預設的改increments

**第二** 
用外key的  要先null再跑constrained

**第三** 
外key記得要 ondelete 不然會被約束

**第四**
改動表單時間 可以排序

**第五** 
要看migrate紀錄 用 php artisan migrate:status

**第六** 
時間預設 timestap 用 useCurrentOnUpdate()

**第七** 
刪除 dropColum 那邊可以用陣列 dropColum(['sss','bbb']);

**第八**
rollback refresh 可以回指定 php artisan migrate:rollback --stup=3

**第九**  
from 可以指定開始的   id->from(100)  從一百開始數

**第十**   超好用
php artisan make:migration add_some_file_to_user_table
        可用 ""打 
php artisan make:migration "add some file to user table"
        


## 欄位

int 只能到 11
可以用

**tinyInteger()**
該tinyInteger方法創建一個TINYINT等效列：

$table->tinyInteger('votes');

## 外key約束
外鍵約束
Laravel 還支持創建用於在資料庫層中的強制引用完整性的外鍵約束。例如，讓我們在 posts 表格上定義一個參考到 users 表格的 id 欄位的 user_id 欄位：

```
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

Schema::table('posts', function (Blueprint $table) {
    $table->unsignedBigInteger('user_id');

    $table->foreign('user_id')->references('id')->on('users');
});
```
由於這種外鍵約束的定義方式過於繁複，Laravel 額外提供了更簡潔的方法來提供更好的開發人員體驗，因此上面的範例還可以這麼寫：

```
Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained();
});
```
foreignId() 是 unsignedBigInteger 的別名，而 constrained() 將使用命名慣例來確定所參考的表格名和欄位名。如果表格名與命名慣例不匹配，可以通過將表格名作為參數傳遞給 constrained() 來指定表格名：

```
Schema::table('posts', function (Blueprint $table) {
    $table->foreignId('user_id')->constrained('users');
});
```


## 多態
就是多態的意思
一個很多人用


![](https://i.imgur.com/jizoafK.png)
你可以看到他做的
id跟type
還有
index
是兩個都有加上index喔 注意

因為type是string
所以index可能會爆開
在mySql爆開 你就回去看一多態


### 關係
一對一
morphTo

morphOne


一對多
morphTo

morphMany

多對多
沒有morphTo這樣去定義
morphBymany去定義

反向跟morphBymany第二參數都是關聯表

多對多一般都用trait
然後trait的function
可以直接啟動 因為boot方法
去看model那篇


### morphMap

###### tags: `Laravel`