zoukankan      html  css  js  c++  java
  • Laravel里firstOrCreate、firstOrNew、updateOrCreate 方法使用

    firstOrCreate

    firstOrCreate 方法将会使用指定的字段 => 值对,来尝试寻找数据库中的记录。如果在数据库中找不到,5.5 以下版本会使用属性来添加一条记录,5.5 及以上版本则将使用第一个参数中的属性以及可选的第二个参数中的属性插入记录

    用法:

    1
    2
    
    User::firstOrCreate(['name' => 'Lisi']);
    User::firstOrCreate(['name' => 'Lisi'], ['age' => 20]);  // 5.5及以上版本支持
    

    查看源码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    # 小于 5.5 版本,只有一个参数
    public function firstOrCreate(array $attributes)
    {
        if (! is_null($instance = $this->where($attributes)->first())) {
            return $instance;
        }
        $instance = $this->model->newInstance($attributes);
        $instance->save();
        return $instance;
    }
    
    # 5.5 版本
    public function firstOrCreate(array $attributes, array $values = [])
    {
        // 判断是否存在,如果存在,返回实例
        if (! is_null($instance = $this->where($attributes)->first())) {
            return $instance;
        }
    
        // 不存在创建,此代码简化就是 $this->newModelInstance($attributes + $values)->save();
        return tap($this->newModelInstance($attributes + $values), function ($instance) {
            $instance->save();
        });
    }
    

    firstOrNew

    会尝试使用指定的属性在数据库中寻找符合的纪录。如果未被找到,将会返回一个新的模型实例。请注意 firstOrnew 返回的模型还尚未保存到数据库。你需要通过手动调用 save 方法来保存它

    用法:

    1
    2
    
    User::firstOrNew(['name' => 'Lisi']);
    User::firstOrNew(['name' => 'Lisi'], ['age' => 20]); // 5.5及以上版本支持
    

    查看源码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    # 小于 5.5 版本,只有一个参数
    public function firstOrNew(array $attributes)
    {
        if (! is_null($instance = $this->where($attributes)->first())) {
            return $instance;
        }
        return $this->model->newInstance($attributes);
    }
    
    # 5.5 版本
    public function firstOrNew(array $attributes, array $values = [])
    {
        if (! is_null($instance = $this->where($attributes)->first())) {
            return $instance;
        }
        return $this->newModelInstance($attributes + $values);
    }
    

    查看源码就更清楚 firstOrCreate 比 firstOrNew 多了 save 方法,两个方法都很实用,根据场景使用它。

    updateOrCreate

    更新数据,如果不存在则创建,这个函数就充分利用到了方法 firstOrNew,此函数版本之间变化不大

    用法:

    1
    
    User::updateOrCreate(['name' => 'Lisi'], ['age' => 20]);
    

    查看源码:

    1
    2
    3
    4
    5
    6
    7
    
    # 5.5 版本
    public function updateOrCreate(array $attributes, array $values = [])
    {
        return tap($this->firstOrNew($attributes), function ($instance) use ($values) {
            $instance->fill($values)->save();
        });
    }
    

    总结

    firstOrCreate:判断之后直接入库
    firstOrNew:判断之后还要做其他业务流程,之后再入库
    updateOrCreate:更新数据,如果不存在则创建

     
  • 相关阅读:
    leetcode 309. Best Time to Buy and Sell Stock with Cooldown
    leetcode 714. Best Time to Buy and Sell Stock with Transaction Fee
    leetcode 32. Longest Valid Parentheses
    leetcode 224. Basic Calculator
    leetcode 540. Single Element in a Sorted Array
    leetcode 109. Convert Sorted List to Binary Search Tree
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 84. Largest Rectangle in Histogram
    leetcode 338. Counting Bits
    git教程之回到过去,版本对比
  • 原文地址:https://www.cnblogs.com/cjjjj/p/12405885.html
Copyright © 2011-2022 走看看