首先还是创建


76

我知道使用:

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

首先检查用户是否存在,如果没有创建,那么如何检查?它会检查提供的所有参数还是有办法指定特定的参数,例如,我可以检查电子邮件地址是否存在,而不是名称吗?因为两个用户可能具有相同的名称,但他们的电子邮件地址必须是独特。

Answers:


140

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

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

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

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

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


我知道。如何指定要匹配的特定属性。我只想检查电子邮件,然后检查是否与更新匹配,如果不创建新记录。
panthro 2014年

谢谢,我已经完成了:$ user = User :: firstOrNew(array('email'=> Input :: get('email')));; $ user-> name = Input :: get('name'); $ user-> save(); 正确?
panthro,2014年

我将其更改为firstOrNew,还是应该使用firstOrCreate?
panthro,2014年

您可以一步一步完成:$user = User::firstOrCreate(array('email' => Input::get('email'), 'name' => Input::get('name')))
2014年

您无法一步一步完成所有操作。如果新用户使用相同的电子邮件但使用不同的名称,它将创建一条新记录(由于电子邮件是唯一的,因此应更新该记录)。因此,为什么我不能做大量的任务。除非您知道解决方法?
panthro 2014年

70

先前的答案已过时。由于Laravel 5.3firstOrCreate现在具有第二个参数values,因此可以一步实现,它用于新记录,但不用于搜索

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

25
我感到很重要的一点是,要提交给数据库的字段必须添加到protected $fillable相应的模型上,因为它使用了批量分配。
WhyAyala

WhyAyala的通知非常重要。如果您在受保护的$ fillable = ['email']中包含原因;只是第一个方法firstOrCreate参数的键,您的查询就像-> INSERT到表名('email' updated_at,,created_at)VALUES ...
darjus

3

更新:

从Laravel 5.3开始,可以一步完成此操作。该firstOrCreate方法现在接受一个可选的第二个数组作为参数。

第一个数组参数是在其上匹配字段/值的数组,第二个数组是如果通过匹配第一个数组中的字段/值未找到匹配项,则在创建模型时要使用的其他字段:

查看文件


1
很棒的补充信息。可以作为评论,而不能作为答案;)
hugomosh

3

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

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

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

然后它只检查电子邮件

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.