Laravel 8.x - 使用 Eloquent 关系存储数据

Posted

技术标签:

【中文标题】Laravel 8.x - 使用 Eloquent 关系存储数据【英文标题】:Laravel 8.x - Storing data with Eloquent Relationship 【发布时间】:2021-07-17 22:30:00 【问题描述】:

我有一个 User 模型 hasOne Membership 模型,有一个 users 表和一个 memberships 表(memberships 表中的每个条目都有一个 外键 链接到 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 表中存储任何内容,我不知道如何使用模型声明的雄辩关系正确编写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`)

【问题讨论】:

错误是什么?您需要在此处发布错误 由于不相关的原因给了我一个错误,但在更正它并仔细检查之后,它现在不会在 memberships 表中存储任何内容 【参考方案1】:

您的解决方案是:

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() 的更多信息,请访问documentation。

【讨论】:

我只是在写我自己问题的答案并看到了通知。谢谢,我会以此作为对正确方法的确认。希望这对其他人有帮助 没问题!!!对于看到此内容的任何人,请记住您可以执行此操作的相反操作(membership -> user 而不是 user -> membership),但使用其他方法,查看我共享的文档,接下来的 2 项执行相同操作,但与关系(它不使用相同的方法)。

以上是关于Laravel 8.x - 使用 Eloquent 关系存储数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8.X Eloquent 中数据库迁移的正确外键约束语法是啥?

Laravel Eloquent - orWhereHas 方法 - 何时使用以及如何使用

Laravel 5:如何使用 'where' 或 'orderBy' 使用 eloquent?

如何使用 eloquent 在 laravel 中编写多个连接

使用 Eloquent 的 Laravel 块方法

Laravel 5 - 使用 Mockery 模拟 Eloquent 模型