gpt4 book ai didi

php - 具有外键约束的 Laravel 模型关系

转载 作者:行者123 更新时间:2023-11-29 04:42:10 26 4
gpt4 key购买 nike

我正在尝试让外键约束在 Laravel 中工作。但我似乎无法再保存我的模型了。

我的数据库结构设置如下(我删除了不必要的代码):

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 属于一个 UserUser 有一个 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, validemail@gmail.comx, 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 可以为 null,但这是一个好的做法吗?我希望 User 始终有一个 Address

最佳答案

我会先从数据库设计开始。

对于 users 表,我将使用:

$table->increments('id');

$table->string('username')->unique();
$table->string('password', 64);

这里不需要address_id。

对于 addresses 表,我将使用:

$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');
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('CASCADE');

您应该在地址表中使用外键并添加 onDelete('CASCADE`) - 现在如果您删除用户,地址将自动删除。您不会有任何孤立地址。

现在插入数据:

$user = new User($data);
$user->save();
$address = new Address($addressData);
$user->address()->save($address);

您无需在 $addressData 中输入任何 user_id - 它会自动填充。

关于php - 具有外键约束的 Laravel 模型关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26205636/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com