【问题标题】:laravel updateOrCreate methodlaravel updateOrCreate 方法
【发布时间】:2017-07-30 11:21:57
【问题描述】:

我的方法中有以下代码,我通过 ajax 将其发送到控制器方法:

    $newUser = \App\UserInfo::updateOrCreate([
        'user_id'   => Auth::user()->id,
        'about'     => $request->get('about'),
        'sec_email' => $request->get('sec_email'),
        'gender'    => $request->get("gender"),
        'country'   => $request->get('country'),
        'dob'       => $request->get('dob'),
        'address'   => $request->get('address'),
        'mobile'    => $request->get('cell_no')
    ]);

dd($request->all()) 给了我:

array:8 [
  "_token" => "fHeEPfTvgMD3FpIBmmc6DmKXFaiuWKZEiOhg6twQ"
  "about" => "Some about me."
  "sec_email" => "example@gmail.com"
  "country" => "Priority highest"
  "gender" => "male"
  "dob" => "12/12/1990"
  "address" => "Some address"
  "cell_no" => "234234234"
]

这是完美的。

jQuery 代码:

$('#submit-editProfile-form').on('click', function() {
    var profileEditForm = $("#edit-user-profile");
    var formData = $('#edit-user-profile').serialize();
    profileEditForm.on('submit', function(e){
        e.preventDefault();
        $.ajaxSetup({
            headers: {
                'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
            }
        });
        $.ajax({
            url:'/freelance/edit-userProfile-info',
            type:'POST',
            data:formData,
            error: function (data) {
               console.log('Error');
            }
        });
    }).submit();
});

现在的问题是我的表中有一条记录,但是上面的代码创建了另一个,第二个是它在每次按钮单击(请求)时创建了两条记录。

【问题讨论】:

    标签: php jquery forms laravel eloquent


    【解决方案1】:

    在您的用例中,您应该指定第二个参数。第一个表示匹配的条件,第二个用于指定要更新的字段。

    $newUser = \App\UserInfo::updateOrCreate([
        //Add unique field combo to match here
        //For example, perhaps you only want one entry per user:
        'user_id'   => Auth::user()->id,
    ],[
        'about'     => $request->get('about'),
        'sec_email' => $request->get('sec_email'),
        'gender'    => $request->get("gender"),
        'country'   => $request->get('country'),
        'dob'       => $request->get('dob'),
        'address'   => $request->get('address'),
        'mobile'    => $request->get('cell_no')
    ]);
    

    这是文档中的一个示例:https://laravel.com/docs/5.4/eloquent

    // If there's a flight from Oakland to San Diego, set the price to $99.
    // If no matching model exists, create one.
    $flight = App\Flight::updateOrCreate(
        ['departure' => 'Oakland', 'destination' => 'San Diego'],
        ['price' => 99]
    );
    

    【讨论】:

    • 如果我错了就阻止我,但是看看这个方法是如何工作的,我不相信'user_id' => Auth::user()->id, 在第二个参数上是必要的。 Builder::updatedOrCreate() 将第一个参数发送到 firstOrNew(),这意味着如果要创建一个新条目,您的用户 ID 无论如何都会应用于新条目。
    • 不错@Claymore!我已经更新了我的代码 sn-p。无论哪种方式都可以正常工作,但这种方式肯定更好。
    • 你如何选择它应该检查的数据库中的哪个表?
    • 这为我解决了。我们的代码有 Fylke::updateOrCreate($county);其中 $county 是一个数组,其中第一个元素是键。我将代码更改为 $key = array_slice($county, 0, 1); Fylke::updateOrCreate($key, $county);问题解决了。谢谢。
    • 我必须关闭我的数据库管理器(在这种情况下为 DBeaver)才能看到方法 updateOrCreate 的变化。我打开了一个表,即使我没有修改数据,updateOrCreate 方法也无法更新记录。关闭 DBMS 后一切正常。
    【解决方案2】:

    Eloquent 有一个名为updateOrCreate 的方法,可以像下面这个例子那样使用:

    <?
    $flight = UserInfo::updateOrCreate(
        [
           'user_id'   => Auth::user()->id,
        ],
        [
           'about'     => $request->get('about'),
           'sec_email' => $request->get('sec_email'),
           'gender'    => $request->get("gender"),
           'country'   => $request->get('country'),
           'dob'       => $request->get('dob'),
           'address'   => $request->get('address'),
           'mobile'    => $request->get('cell_no')
        ],
    );
    
    1. user_id 搜索可能是识别行的最佳方式。
    2. 它根据第二个数组中给定的值创建或更新。

    以下是方法的标志。

    /**
     * Create or update a record matching the attributes, and fill it with values.
     *
     * @param  array  $attributes
     * @param  array  $values
     * @return \Illuminate\Database\Eloquent\Model
     */
    public function updateOrCreate(array $attributes, array $values = [])
    

    【讨论】:

      猜你喜欢
      • 2022-11-07
      • 2019-06-21
      • 2020-08-06
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多