我試圖讓外鍵約束在Laravel中工作。但我似乎無法挽救我的模型了。Laravel與外鍵約束的模型關係
我的數據庫結構的設置如下(I已移除不必要的代碼):
Schema::create($this->tableName, function(Blueprint $table)
{
$table->increments('id');
$table->string('username')->unique();
$table->string('password', 64);
$table->integer('address_id')->unsigned();
});
Schema::create($this->tableName, function(Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned();
$table->string('name');
$table->string('surname');
$table->string('street');
$table->string('number');
$table->string('town');
$table->string('country');
});
所以Address
是在一個單獨的表和Address
屬於User
。 User
有一個Address
。
接下來,我已經創建了相應的機型:
Class User extends Model
{
public function address()
{
return $this->hasOne('Address');
}
}
Class Address extends Model
{
public function user()
{
return $this->belongsTo('User');
}
}
現在,當我嘗試創建與Address
一個User
並保存它,我得到的約束錯誤。我試過兩種方法(先保存User
並先保存Address
),但都出錯。
我的第一個想法是這樣的:
// Create a new user
$user = new User($data);
$address = new Address($addressData);
$address->user()->associate($user);
$user->push(); // Error here
但這給出了錯誤:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`eet`.`users`, CONSTRAINT `users_address_id_foreign` FOREIGN KEY (`address_id`) REFERENCES `addresses` (`id`)) (SQL: insert into `users` (`username`, `email`, `password`, `type`, `phone`, `cellphone`, `newsletter_week`, `ip`, `updated_at`, `created_at`) values (adsadsad, [email protected], passWO23dw00, customer, 123123213, 1234567890, 1, ::1, 2014-10-05 19:56:03, 2014-10-05 19:56:03))
所以,我想保存Address
第一,然後User
,如:
$user = new User($data);
$address = new Address($addressData);
$address->save(); // Error here
$address->user()->associate($user);
$user->push();
但是,然後生成以下錯誤:
SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'user_id' cannot be null (SQL: insert into `addresses` (`name`, `surname`, `street`, `number`, `town`, `country`, `user_id`) values (Foo, Bar, FooStreet, 200, Townsville, nl,))
那麼這樣做的好方法是什麼?我可以將User
設置爲空的address_id
,但是這是一種很好的做法嗎?我想要一個User
始終有一個Address
。
我會說'用戶'是這裏的「定義實體」。而'用戶'有一個'地址'。我認爲你的意思是:「從'Address'中刪除'user_id',你很好走。」但是,我可以製作「孤兒」地址。 – Matthijn 2014-10-05 18:19:09
你的「地址」表是否有'user_id'? – 2014-10-05 18:20:08