我想将FirstOrCreate用于新用户。
就像那样:
$user = User::FirstOrCreate([
'name' => $request->username,
'email' => $request->email,
'password' => User::generatePassword()
]);
generatePassword()只生成一个随机的8个字符串字符串。
因为它正在寻找具有此密码值的用户,所以它不起作用。
因此,当没有用户使用此电子邮件时,它可以正常工作,但是当它存在时会给我一个约束错误。
解决问题的最简洁方法是什么?
答案 0 :(得分:1)
你犯了一个语法错误。 ::firstOrCreate
根据提供的标准进行搜索,如果找不到,则会创建数据库条目并返回包含该数据的模型。 ::firstOrNew
执行而不自动保存模型。
所以,你会想要这个。
$user = User::firstOrNew([
'email' => $request->email,
]);
我们不包括name
或password
因为我们没有检查Josh与josh@stackoverflow.com使用密码foobar123是否存在,我们只是想知道josh@stackoverflow.com是否有一个帐户。
您的控制器逻辑似乎有点奇怪,因为我们首先要在创建模型之前验证的信息,但我会随之滚动。
$user = User::firstOrNew([
'email' => $request->email,
]);
// This model does not have a DB record.
if (!$user->exists)
{
$user->name = $request->username;
$user->password = User::generatePassword();
$user->save();
}
return $user;
根据这个逻辑,我们找到一个基于电子邮件的记录。如果记录存在,我们通过它。如果没有,我们在创建记录之前为其分配用户名并为其生成密码,然后传递它。