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

相关文章

Hessian开源的远程通讯,采用二进制 RPC的协议,基于 HTTP 传输。可以实现PHP调用Java,Python,C#等多语...
初识Mongodb的一些总结,在Mac Os X下真实搭建mongodb环境,以及分享个Mongodb管理工具,学习期间一些总结...
边看边操作,这样才能记得牢,实践是检验真理的唯一标准.光看不练假把式,光练不看傻把式,边看边练真把式....
在php中,结果输出一共有两种方式:echo和print,下面将对两种方式做一个比较。 echo与print的区别: (...
在安装好wampServer后,一直没有使用phpMyAdmin,今天用了一下,phpMyAdmin显示错误:The mbstring exte...
变量是用于存储数据的容器,与代数相似,可以给变量赋予某个确定的值(例如:$x=3)或者是赋予其它的变...