2016-07-01 57 views
0

我想知道在創建用戶時是否可以跳過或忽略約束違規。我有一個外鍵address_id的用戶模型。第一次創建模型時,Laravel跳過約束違規

Schema::table('user', function($table) { 
    $table->foreign('address_id')->references('address_id')->on('address')->onDelete('cascade'); 
}); 

在創建用戶時,我想創建一個沒有地址的用戶,但以後會添加。

return User::create([ 
    'first_name' => $data['firstname'], 
    'last_name' => $data['lastname'], 
    'email' => $data['email'], 
    'password' => bcrypt($data['password']), 
]); 

但是因此違反了約束條件。有可能做到這一點?

編輯:

因此,我想保持的約束,但上面的例子運行到違反約束那麼什麼是解決它的最好方法?製作虛擬地址條目?

回答

1

您可以更改DB爲要添加的模型時:

protected function turnOffDatabaseChecks() 
{ 
    DB::statement('SET FOREIGN_KEY_CHECKS=0;'); 
    Eloquent::unguard(); 
} 

protected function turnOnDatabaseChecks() 
{ 
    DB::statement("SET sql_mode = 'STRICT_ALL_TABLES';"); 
    Eloquent::reguard(); 
} 

然後在用戶模式:

$this->turnOffDatabaseChecks(); 

$user = User::create([ 
    'first_name' => $data['firstname'], 
    'last_name' => $data['lastname'], 
    'email' => $data['email'], 
    'password' => bcrypt($data['password']), 
]); 

$this->turnOnDatabaseChecks(); 

return $user; 

不過,我會使用非常謹慎和會問自己爲什麼你有一個你想忽略的外鍵約束。

+0

謝謝,我不想忽略,就像你說的,但我不知道如何解決它。這是一個只有這些字段的註冊表單:名字,姓氏,電子郵件和密碼。我想保持約束,但不知道如何在這個例子中,最壞的情況下會跳過它像你的例子.. – Jacob

+1

如果用戶不必有一個地址那麼爲什麼它是一個約束? –

+0

@chaseenyc,我對此有點新,你可能是對的,我認爲這將是一個很好的做法,使數據庫保持緊密。所以這是不可能的,因爲對此進行約束。 – Jacob