用雄辩的查找或创造

2022-08-30 12:30:21

我最近开始与LaravelEloquent合作,并且想知道缺乏为模型查找或创建选项的问题。你总是可以写,例如:

$user = User::find($id);
if (!$user) {
    $user = new User;
}

但是,难道没有更好的方法来查找或创建吗?在示例中,这似乎微不足道,但对于更复杂的情况,获取现有记录并更新它或创建新记录将非常有帮助。


答案 1

以下是原始接受的答案:Laravel-4

已经有一个可用的方法,当使用此方法时,它会抛出失败,但在您的情况下,您可以通过在模型中创建方法来执行此操作,例如,如果您有一个模型,那么您只需将此函数放在模型中即可findOrFailLaravelModelNotFoundExceptionUser

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

在控制器中,您可以使用

$user =  User::findOrCreate(5);
$user->first_name = 'John';
$user->last_name = 'Doe';
$user->save();

如果存在 具有 的用户,则将对其进行更新,否则将创建一个新用户,但将(自动递增)。id5idlast_user_id + 1

这是执行相同操作的另一种方法:

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

例如,您可以在模型中使用 a,而不是创建静态方法,因此 will 和 调用 中的方法相同,例如scopeModelscopeMethodNameModel::methodName()

$user =  User::findOrCreate(5);

更新:

在 中可用,答案太旧了,它是在 中给出的。firstOrCreateLaravel 5xLaravel-4.02013

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

public function firstOrCreate(array $attributes, array $values = [])

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

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

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

接口文档


答案 2

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

$user = User::firstOrCreate(['id' => $id]);

推荐