我知道使用:
User::firstOrCreate(array('name' => $input['name'], 'email' => $input['email'], 'password' => $input['password']));
检查用户是否先存在,如果不存在则创建它,但是如何检查?它是否检查所提供的所有参数或是否有指定特定参数的方法,例如我可以检查电子邮件地址是否存在,而不是名称 - 因为两个用户可能具有相同的名称,但他们的电子邮件地址必须是唯一的。
答案 0 :(得分:110)
firstOrCreate()
检查在finds
匹配之前存在的所有参数。如果并非所有参数都匹配,那么将创建模型的新实例。
如果您只想查看特定字段,请仅使用数组中只有一个项目的firstOrCreate(['field_name' => 'value'])
。这将返回匹配的第一个项目,如果找不到匹配项,则会创建一个新项目。
firstOrCreate()
和firstOrNew()
之间的差异:
firstOrCreate()
将自动在数据库中创建新条目。否则它会给你匹配的项目。firstOrNew()
将为您提供一个新的模型实例,但只有在您明确这样做时才会保存到数据库中(在模型上调用save()
)。否则它会给你匹配的项目。在一个或另一个之间进行选择取决于您想要做什么。如果要在第一次保存模型实例之前修改模型实例(例如,设置name
或某些必填字段),则应使用firstOrNew()
。如果您可以使用参数立即在数据库中创建新模型实例而不进行修改,则可以使用firstOrCreate()
。
答案 1 :(得分:41)
以前的答案已经过时了。由于Laravel 5.3,firstOrCreate
现在有第二个参数values
,它可以用于新记录,但不能用于搜索
$user = User::firstOrCreate([
'email' => 'dummy@domain.com'
], [
'firstName' => 'Taylor',
'lastName' => 'Otwell'
]);
答案 2 :(得分:2)
更新:
从Laravel 5.3开始,只需一步即可完成此操作; firstOrCreate
方法现在接受可选的第二个数组作为参数。
第一个数组参数是字段/值匹配的数组,第二个数组是在创建模型时使用的附加字段,如果通过匹配第一个数组中的字段/值找不到匹配项:
答案 3 :(得分:1)
firstOrCreate()在找到匹配项之前检查所有存在的参数。
如果您只想检查特定的字段,则使用firstOrCreate(['field_name'=>'value'])之类的
$user = User::firstOrCreate([
'email' => 'abcd@gmail.com'
], [
'firstName' => 'abcd',
'lastName' => 'efgh',
'veristyName'=>'xyz',
]);
然后只检查电子邮件
答案 4 :(得分:0)
您可以随时检查当前实例中是否在
的帮助下创建了记录$user->wasRecentlyCreated
So basically you can
if($user->wasRecentlyCreated){
// do what you need to do here
}