使用Eloquent查找或创建

cha*_*eyh 27 php laravel eloquent laravel-4

我最近开始与工作Laravel口才,和不知道的是,缺乏一个查找或创建模型选项.你总是可以写,例如:

$user = User::find($id);
if (!$user) {
    $user = new User;
}
Run Code Online (Sandbox Code Playgroud)

但是,有没有更好的方法来查找或创建?看来在这个例子中微不足道,但对于更复杂的情况下,这将是非常有益要么让现有的记录并更新或创建一个新的.

The*_*pha 58

以下是最初接受的答案:laravel-4

已有一种方法findOrFail可供使用Laravel,当使用此方法时,它会抛出ModelNotFoundException失败,但在您的情况下,您可以通过在模型中创建方法来执行此操作,例如,如果您有User模型,则只需将此函数放入模型中

// Put this in any model and use
// Modelname::findOrCreate($id);
public static function findOrCreate($id)
{
    $obj = static::find($id);
    return $obj ?: new static;
}
Run Code Online (Sandbox Code Playgroud)

从您的控制器,您可以使用

$user =  User::findOrCreate(5);
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->save();
Run Code Online (Sandbox Code Playgroud)

如果具有idod 的用户5是exixts,那么它将被更新,否则将创建新用户但是idlast_user_id + 1(自动递增).

这是另一种做同样事情的方法:

public function scopeFindOrCreate($query, $id)
{
    $obj = $query->find($id);
    return $obj ?: new static;
}
Run Code Online (Sandbox Code Playgroud)

而不是创建一个静态方法,你可以使用一个scope示范,让法的Model将是scopeMethodName和呼叫Model::methodName(),和你一样的静态方法一样,例如

$user =  User::findOrCreate(5);
Run Code Online (Sandbox Code Playgroud)

更新:

firstOrCreate是可用的Laravel 5x,答案是太旧,它被赋予了Laravel-4.02013.

在Laravel 5.3中,该firstOrCreate方法具有以下声明:

public function firstOrCreate(array $attributes, array $values = [])
Run Code Online (Sandbox Code Playgroud)

这意味着您可以像这样使用它:

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

用户的存在将仅通过电子邮件进行检查,但在创建时,新记录将保存电子邮件和姓名.

API文档

  • Laravel 5x中不存在`findOrCreate`,因为您无法仅使用ID创建内容.我认为你所指的是`findOrNew`. (2认同)

Oli*_*ria 27

或者,在这种情况下,您还可以使用Laravel的函数并搜索id作为属性,即

$user = User::firstOrCreate(['id' => $id]);
Run Code Online (Sandbox Code Playgroud)


Pet*_*uck 10

Laravel 4型号具有内置findOrNew方法,可满足您的需求:

$user = User::findOrNew($id);
Run Code Online (Sandbox Code Playgroud)

  • 注意 find 或 new 实例化一个对象,但你仍然需要使用 save() 函数 (2认同)

Sal*_*lar 6

在Laravel 5中:
您可以使用两种方法通过批量分配属性来创建模型:firstOrCreatefirstOrNew.
firstOrCreate方法将尝试使用给定的列/值对定位数据库记录.如果在数据库中找不到该模型,则将插入具有给定属性的记录.
firstOrNew方法firstOrCreate将尝试在与给定属性匹配的数据库中查找记录.但是,如果未找到模型,则将返回新的模型实例.请注意,返回的模型firstOrNew尚未保留到数据库中.您需要手动调用save来保存它:

// Retrieve the flight by the attributes, or create it if it doesn't exist...
$flight = App\Flight::firstOrCreate(['name' => 'Flight 10']);

// Retrieve the flight by the attributes, or instantiate a new instance...
$flight = App\Flight::firstOrNew(['name' => 'Flight 10']);
Run Code Online (Sandbox Code Playgroud)


Maj*_*bib 6

根据主键ID查找或新建

$user = User::findOrNew($id); // if exist then update else insert
$user->name= $data['full_name'];
$user->save();
Run Code Online (Sandbox Code Playgroud)

基于非主要单一字段的First或New

// get the record where field_name=value else insert new record
$user = User::firstOrNew(['field_name'=>'value']); 
$user->name= $data['full_name'];
$user->save();
Run Code Online (Sandbox Code Playgroud)

First或New基于非主键字段

// get the record where field_name1=value1 and field_name2=value2, else insert new record
$user = User::firstOrNew(['field_name1'=>'value1','field_name2'=>'value2']);
$user->name= $data['full_name'];
$user->save();
Run Code Online (Sandbox Code Playgroud)