laravel updateOrCreate 方法

问题描述 投票:0回答:4

我的方法中有以下代码,我通过 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" => "[email protected]"
  "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
4个回答
169
投票

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

$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#other-creation-methods

// 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]
);

12
投票

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 = [])

0
投票

在 Laravel 中,createOrUpdate() 方法用于判断数据是否存在,然后创建新条目或更新表中现有条目。

注意:您应该在您的案例的方法中包含一个条件。否则,它将创建一个新条目。

例如,如果您想查看user_id,代码如下:

$newUser = \App\UserInfo::updateOrCreate([
    //Add your condition here.
    //For ex: you want to add or update data by user_id:
    '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')
]);

使用这两个参数,该方法将检查指定的授权user_id是否存在,然后更新数据;否则,它将创建新数据。

查看官方文档: https://laravel-news.com/firstornew-firstorcreate-firstor-updateorcreate


0
投票

还有一件事,如果您尝试使用默认值 (id) 以外的主键,您可能会遇到一条错误,提示“未找到列:1054 'where 子句'中的未知列 'id'”,你还会发现错误中哪里 id 为空...

您所需要的只是在用户模型中设置默认主键让我们假设它是 App\Models\Post

然后写 受保护的 $primaryKey = 'user_id'

就是这样:)

© www.soinside.com 2019 - 2024. All rights reserved.