php – 找到或创造与雄辩

前端之家收集整理的这篇文章主要介绍了php – 找到或创造与雄辩前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近开始使用 LaravelEloquent,并且想知道模型是否缺少查找或创建选项.你可以随时写,例如:
$user = User::find($id);
if (!$user) {
    $user = new User;
}

但是,没有更好的方法来寻找或创造?在这个例子中似乎是微不足道的,但对于更复杂的情况来说,要真正有助于获取现有记录并进行更新或创建新记录.

以下是原来接受的答案: laravel-4

在Laravel中已经有一个findOrFail方法,当使用这种方法时,它会在失败时抛出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;
}

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

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

如果id为5的用户是exixts,那么它将被更新,否则将创建一个新用户,但id将为last_user_id 1(自动递增).

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

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

您可以在Model中使用一个范围,而不是创建一个静态方法,因此Model中的方法将是scopeMethodName并调用Model :: methodName(),与静态方法相同,例如

$user =  User::findOrCreate(5);

更新:

第一个OreCreate在Laravel 5x中可用,答案太旧了,它在2013年被授予Laravel-4.0.

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

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

这意味着你可以这样使用它:

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

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

API Docs

猜你在找的PHP相关文章