如何在Laravel中修复“从空值创建默认对象”?

时间:2017-10-30 10:44:19

标签: php ajax laravel

在刀片中我有这段代码:

usernameask

当我点击底部时,执行Ajax功能:

@foreach ($employees as $key => $employee)
<tr id="{{$employee->id}}">
<td class="visibleemployee tdcenter">
<form action="{{route('admin.employees.cambiarVisible',$employee->id)}}">
  <button type="button" id="buttonchangevisible" data-id="{{$employee->id}}">
    @if ($employee->public == '1')
        <i class="fa fa-check" aria-hidden="true" id="margindataemployee" class="cambiarsiporno"></i>
    @else
        <i class="fa fa-times" aria-hidden="true" id="margindataemployee"></i>
    @endif
  </button>
  <input type="hidden" name="_token" value="{{Session::token()}}">
 </form>
 </td>
 </tr>
 @endforeach

并调用下一个方法:

$("#buttonchangevisible").click(function(e){
        e.preventDefault();
        var button = $(this);
        var id = button.data('id');
        var formData = new FormData($(this)[0]);
        $.ajax({
            url:'employee/cambiarVisible/' + id,
            type: 'PUT',
            data: formData,
            success: function() {
                location.reload();
            },
            cache: false,
            contentType: false,
            processData: false
        });
        return false;
    });

现在不会出现任何错误,如果我点击第一行,拨打电话但不要更新可见。

但如果我点击其他行,请不要拨打电话。

2 个答案:

答案 0 :(得分:2)

我写了一段类似的代码。 我动态生成了表单,然后调用了一些JavaScript / jQuery。

生成按钮的代码:

<button class="btn btn-danger btn-block deleteUserBtn" data-name="{{ $user->name }}" data-id="{{ $user->id }}" data-type="delete" onclick="return false;"><i class="glyphicon glyphicon-trash"></i> Delete</button>

然后使用以下代码,我执行了ajax调用。将click事件附加到正文的原因是因为有多个删除按钮(这是针对具有多个删除按钮的用户概述,每个用户一个)。这些按钮可以使用jQuery生成,如果绑定到按钮,则不会触发click事件。

$('body').on('click', '.deleteUserBtn', function() {
    var button = $(this) // Button that triggered the event
    var id = button.data('id');
    var name = button.data('name');
    var csrf = $('input[name=_token]').val(); // This token is already on the page, you need a token to prevent csrf

    if( confirm('Are you sure you want to delete: ' + name + '?') ) {
        var url = "{{ route('overview.users.destroy', ':id') }}";
        url = url.replace(':id', id);
        $.ajax({
            method: "DELETE",
            url: url,
            data: {
                'id': id,
                '_token': csrf
            },
        }).done(function(response) {
            // Check if it is successful
            if(response == 'deleted') {
                // Reload page
                location.reload();
            } else {
                alert('error');
                console.log(response);
            }
        }).fail(function(response) {
            alert('error 2');
            console.log(response);
        });
    }
});

正如您所看到的,我只是将id作为参数传递。

在您的情况下,要更新用户,您只需使用以下代码:

public function cambiarVisible(Request $request, $id)
    {
        $employee = Worker::findOrFail($id);
        $employee->public = ($employee->public == 1) ? 0 : 1;
        $employee->save();
    }

答案 1 :(得分:1)

您的表单看起来像是一个使用employee/cambiarVisible/{id}作为网址的ajax提交。因为id通配符应该是一个php变量(在JS中看不到变量),所以它不会被传递给控制器​​。

尝试类似

的内容

var id = {!! json_encode($employee->id) !!};

然后将网址更改为

url:'employee/cambiarVisible/' + id,