首先或创造

时间:2014-08-07 09:08:49

标签: laravel laravel-4 eloquent

我知道使用:

User::firstOrCreate(array('name' => $input['name'], 'email' => $input['email'], 'password' => $input['password']));

检查用户是否先存在,如果不存在则创建它,但是如何检查?它是否检查所提供的所有参数或是否有指定特定参数的方法,例如我可以检查电子邮件地址是否存在,而不是名称 - 因为两个用户可能具有相同的名称,但他们的电子邮件地址必须是唯一的。

5 个答案:

答案 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方法现在接受可选的第二个数组作为参数。

第一个数组参数是字段/值匹配的数组,第二个数组是在创建模型时使用的附加字段,如果通过匹配第一个数组中的字段/值找不到匹配项:

See documentation

答案 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

}