首先或创造

pan*_*hro 58 laravel eloquent laravel-4

我知道使用:

User::firstOrCreate(array('name' => $input['name'], 'email' => $input['email'], 'password' => $input['password']));
Run Code Online (Sandbox Code Playgroud)

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

low*_*nds 116

firstOrCreate()检查在finds匹配之前存在的所有参数.如果并非所有参数都匹配,则将创建模型的新实例.

如果您只想检查特定字段,firstOrCreate(['field_name' => 'value'])则只使用数组中的一个项目.这将返回匹配的第一个项目,如果找不到匹配项,则创建一个新项目.

firstOrCreate()和之间的区别firstOrNew():

  • firstOrCreate()如果找不到匹配项,将自动在数据库中创建新条目.否则它会给你匹配的项目.
  • firstOrNew()如果找不到匹配项,将为您提供一个新的模型实例,但只有在您明确这样做时才会保存到数据库中(调用save()模型).否则它会给你匹配的项目.

在一个或另一个之间进行选择取决于您想要做什么.如果要在第一次保存之前修改模型实例(例如,设置name或某些必填字段),则应使用firstOrNew().如果您可以使用参数立即在数据库中创建新模型实例而不进行修改,则可以使用firstOrCreate().


umb*_*rel 52

以前的答案已经过时了.自从Laravel 5.3以来,firstOrCreate现在有了第二个参数values,可以实现一步,它可用于新记录,但不能用于搜索

$user = User::firstOrCreate([
    'email' => 'dummy@domain.com'
], [
    'firstName' => 'Taylor',
    'lastName' => 'Otwell'
]);
Run Code Online (Sandbox Code Playgroud)

  • 我觉得重要的是要提到你想要提交到数据库的字段需要添加到相应模型上的`protected $ fillable`,因为它使用了质量赋值. (14认同)

alb*_*rus 5

firstOrCreate()在找到匹配之前检查所有参数是否存在。

如果您只想检查特定字段,请使用firstOrCreate(['field_name' => 'value'])

$user = User::firstOrCreate([
    'email' => 'abcd@gmail.com'
], [
    'firstName' => 'abcd',
    'lastName' => 'efgh',
    'veristyName'=>'xyz',
]);
Run Code Online (Sandbox Code Playgroud)

然后它只检查电子邮件。