加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 找到或创造与雄辩

发布时间:2020-12-13 13:47:26 所属栏目:PHP教程 来源:网络整理
导读:我最近开始使用 Laravel和 Eloquent,并且想知道模型是否缺少查找或创建选项.你可以随时写,例如: $user = User::find($id);if (!$user) { $user = new User;} 但是,没有更好的方法来寻找或创造?在这个例子中似乎是微不足道的,但对于更复杂的情况来说,要真正
我最近开始使用 Laravel和 Eloquent,并且想知道模型是否缺少查找或创建选项.你可以随时写,例如:
$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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读