Laravel 8.x - 存储具有 Eloquent 关系的数据
Laravel 8.x - Storing data with Eloquent Relationship
我有一个 User
模型 hasOne
Membership
模型,有一个 users
table 和一个 memberships
table(memberships
table 中的每个条目都有一个 外键 链接到 user_id
)。
我制作了一个注册页面,允许用户有 7 天的会员试用期,但我在存储数据时遇到问题。
这是注册表中数据的dd()
:
"_token" => "ckRlMligEyTwu7ssOi4TmesycbsPpVQlrJ4jQaBd"
"username" => "JaneDoe"
"password" => "password"
"password_confirmation" => "password"
"expiration" => "2021-04-30"
现在在我的控制器中我有以下 store()
方法:
public function store(Request $request) {
// validating
$this->validate($request, [
'username' => ['required', 'max:200'],
'password' => 'required|confirmed',
'expiration' => 'required'
]);
// storing
User::create([
'username' => $request->username,
'password' => Hash::make($request->password),
'expiration' => $request->expiration
]);
}
这不会在 memberships
table 中存储任何内容,我不知道如何使用模型的 [=50 正确编写 store
方法=] 关系 声明。
感谢您的帮助。
编辑:
在尝试理解的同时,我修改了 store()
函数,现在看起来像这样:
public function store(Request $request) {
// validating
$this->validate($request, [
'username' => ['required', 'max:200'],
'password' => 'required|confirmed',
'expiration' => 'required'
]);
// storing
User::create([
'username' => $request->username,
'password' => Hash::make($request->password)
])->membership(Membership::create([
'expiration' => $request->expiration
]));
}
现在似乎 Laravel 不知道从哪里获取新创建用户的 user_id
,如错误提示:
SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `memberships` (`expiration`, `updated_at`, `created_at`)
您的解决方案是:
User::create([
'username' => $request->username,
'password' => Hash::make($request->password)
])->membership()->create([
'expiration' => $request->expiration
]);
使用关系(membership()
而不是 membership
作为属性)将已经知道关系键(在这种情况下为 user_id
)。
您可以在 documentation 中查看更多相关信息。
其他相同的方法是:
$membership = new Membership([
'expiration' => $request->expiration
]);
User::create([
'username' => $request->username,
'password' => Hash::make($request->password)
])->membership()->save($membership);
有关 save()
on the documentation 的更多信息。
我有一个 User
模型 hasOne
Membership
模型,有一个 users
table 和一个 memberships
table(memberships
table 中的每个条目都有一个 外键 链接到 user_id
)。
我制作了一个注册页面,允许用户有 7 天的会员试用期,但我在存储数据时遇到问题。
这是注册表中数据的dd()
:
"_token" => "ckRlMligEyTwu7ssOi4TmesycbsPpVQlrJ4jQaBd"
"username" => "JaneDoe"
"password" => "password"
"password_confirmation" => "password"
"expiration" => "2021-04-30"
现在在我的控制器中我有以下 store()
方法:
public function store(Request $request) {
// validating
$this->validate($request, [
'username' => ['required', 'max:200'],
'password' => 'required|confirmed',
'expiration' => 'required'
]);
// storing
User::create([
'username' => $request->username,
'password' => Hash::make($request->password),
'expiration' => $request->expiration
]);
}
这不会在 memberships
table 中存储任何内容,我不知道如何使用模型的 [=50 正确编写 store
方法=] 关系 声明。
感谢您的帮助。
编辑:
在尝试理解的同时,我修改了 store()
函数,现在看起来像这样:
public function store(Request $request) {
// validating
$this->validate($request, [
'username' => ['required', 'max:200'],
'password' => 'required|confirmed',
'expiration' => 'required'
]);
// storing
User::create([
'username' => $request->username,
'password' => Hash::make($request->password)
])->membership(Membership::create([
'expiration' => $request->expiration
]));
}
现在似乎 Laravel 不知道从哪里获取新创建用户的 user_id
,如错误提示:
SQLSTATE[HY000]: General error: 1364 Field 'user_id' doesn't have a default value (SQL: insert into `memberships` (`expiration`, `updated_at`, `created_at`)
您的解决方案是:
User::create([
'username' => $request->username,
'password' => Hash::make($request->password)
])->membership()->create([
'expiration' => $request->expiration
]);
使用关系(membership()
而不是 membership
作为属性)将已经知道关系键(在这种情况下为 user_id
)。
您可以在 documentation 中查看更多相关信息。
其他相同的方法是:
$membership = new Membership([
'expiration' => $request->expiration
]);
User::create([
'username' => $request->username,
'password' => Hash::make($request->password)
])->membership()->save($membership);
有关 save()
on the documentation 的更多信息。