Laravel更新mysql表返回空数据

Posted

技术标签:

【中文标题】Laravel更新mysql表返回空数据【英文标题】:Laravel update mysql table return empty data 【发布时间】:2019-06-14 00:34:47 【问题描述】:

我正在开发一个应用程序,我使用 laravel 和数据表从 mysql 表中显示/编辑/删除数据。尝试在 Mysql 表中添加或编辑数据并更新数据时出现此错误:

代码如下:

<!DOCTYPE html>
<html>
<head>
    <title>Datatables Server Side Processing in Laravel</title>
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css" />
    <script src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script>
    <script src="https://cdn.datatables.net/1.10.12/js/dataTables.bootstrap.min.js"></script>       
    <link rel="stylesheet" href="https://cdn.datatables.net/1.10.12/css/dataTables.bootstrap.min.css" />
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>

<div class="container">
    <br />
    <h3 align="center">Datatables Server Side Processing in Laravel</h3>
    <br />
    <div align="right">
        <button type="button" name="add" id="add_data" class="btn btn-success btn-sm">Add</button>
    </div>
    <br />
    <table id="student_table" class="table table-bordered" style="width:100%">
        <thead>
            <tr>
                <th>First Name</th>
                <th>Last Name</th>
                <th>Action</th>
                <th><button type="button" name="bulk_delete" id="bulk_delete" class="btn btn-danger btn-xs"><i class="glyphicon glyphicon-remove"></i></button></th>
            </tr>
        </thead>
    </table>
</div>

<div id="studentModal" class="modal fade" role="dialog">
    <div class="modal-dialog">
        <div class="modal-content">
            <form method="post" id="student_form">
                <div class="modal-header">
                   <button type="button" class="close" data-dismiss="modal">&times;</button>
                   <h4 class="modal-title">Add Data</h4>
                </div>
                <div class="modal-body">
                    <input type="hidden" name="_token" value=" csrf_token() ">
                    <span id="form_output"></span>
                    <div class="form-group">
                        <label>Enter First Name</label>
                        <input type="text" name="first_name" id="first_name" class="form-control" />
                    </div>
                    <div class="form-group">
                        <label>Enter Last Name</label>
                        <input type="text" name="last_name" id="last_name" class="form-control" />
                    </div>
                </div>
                <div class="modal-footer">
                     <input type="hidden" name="student_id" id="student_id" value="" />
                    <input type="hidden" name="button_action" id="button_action" value="insert" />
                    <input type="submit" name="submit" id="action" value="Add" class="btn btn-info" />
                    <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
                </div>
            </form>
        </div>
    </div>
</div>

<script type="text/javascript">
$(document).ready(function() 
     $('#student_table').DataTable(        
        "processing": true,
        "serverSide": true,
        "ajax": " route('ajaxdata.getdata') ",
        "columns":[
             "data": "first_name" ,
             "data": "last_name" ,
             "data": "action", orderable:false, searchable: false,
             "data":"checkbox", orderable:false, searchable:false
        ]
     );

    $('#add_data').click(function()
        $('#studentModal').modal('show');
        $('#student_form')[0].reset();
        $('#form_output').html('');
        $('#button_action').val('insert');
        $('#action').val('Add');
        $('.modal-title').text('Add Data');
    );

    $('#student_form').on('submit', function(event)
        event.preventDefault();
        var form_data = $(this).serialize();
        $.ajax(
            url:" route('ajaxdata.postdata') ",
            method:"POST",
            data:form_data,
            dataType:"json",
            success:function(data)
            
                if(data.error.length > 0)
                
                    var error_html = '';
                    for(var count = 0; count < data.error.length; count++)
                    
                        error_html += '<div class="alert alert-danger">'+data.error[count]+'</div>';
                    
                    $('#form_output').html(error_html);
                
                else
                
                    $('#form_output').html(data.success);
                    $('#student_form')[0].reset();
                    $('#action').val('Add');
                    $('.modal-title').text('Add Data');
                    $('#button_action').val('insert');
                    $('#student_table').DataTable().ajax.reload();
                
            
        )
    );

    $(document).on('click', '.edit', function()
        var id = $(this).attr("id");
        $('#form_output').html('');
        $.ajax(
            url:"route('ajaxdata.fetchdata')",
            method:'get',
            data:id:id,
            dataType:'json',
            success:function(data)
            
                $('#first_name').val(data.first_name);
                $('#last_name').val(data.last_name);
                $('#student_id').val(id);
                $('#studentModal').modal('show');
                $('#action').val('Edit');
                $('.modal-title').text('Edit Data');
                $('#button_action').val('update');
            
        )
    );

    $(document).on('click', '.delete', function()
        var id = $(this).attr('id');
        if(confirm("Are you sure you want to Delete this data?"))
        
            $.ajax(
                url:"route('ajaxdata.removedata')",
                mehtod:"get",
                data:id:id,
                success:function(data)
                
                    alert(data);
                    $('#student_table').DataTable().ajax.reload();
                
            )
        
        else
        
            return false;
        
    ); 

    $(document).on('click', '#bulk_delete', function()
        var id = [];
        if(confirm("Are you sure you want to Delete this data?"))
        
            $('.student_checkbox:checked').each(function()
                id.push($(this).val());
            );
            if(id.length > 0)
            
                $.ajax(
                    url:" route('ajaxdata.mas-s-remove')",
                    method:"get",
                    data:id:id,
                    success:function(data)
                    
                        alert(data);
                        $('#student_table').DataTable().ajax.reload();
                    
                );
            
            else
            
                alert("Please select atleast one checkbox");
            
        
    );

);
</script>
</body>
</html>

控制器:

<?php

namespace App\Http\Controllers;

use Validator;
use Illuminate\Http\Request;
use App\Student;
use Yajra\DataTables\DataTables;

class AjaxdataController extends Controller

    function index()
    
     return view('student.ajaxdata');
     //http://127.0.0:8000/ajaxdata
    

    function getdata()
    
     $students = Student::select('id', 'first_name', 'last_name');
     return DataTables::of($students)
            ->addColumn('action', function($student)
                return '<a href="#" class="btn btn-xs btn-primary edit" id="'.$student->id.'"><i class="glyphicon glyphicon-edit"></i> Edit</a><a href="#" class="btn btn-xs btn-danger delete" id="'.$student->id.'"><i class="glyphicon glyphicon-remove"></i> Delete</a>';
            )
            ->addColumn('checkbox', '<input type="checkbox" name="student_checkbox[]" class="student_checkbox" value="$id" />')
            ->rawColumns(['checkbox','action'])
            ->make(true);
    

    function postdata(Request $request)
    
        $validation = Validator::make($request->all(), [
            'first_name' => 'required',
            'last_name'  => 'required',
        ]);

        $error_array = array();
        $success_output = '';
        if ($validation->fails())
        
            foreach($validation->messages()->getMessages() as $field_name => $messages)
            
                $error_array[] = $messages;
            
        
        else
        
            if($request->get('button_action') == "insert")
            
                $student = new Student([
                    'first_name'    =>  $request->get('first_name'),
                    'last_name'     =>  $request->get('last_name')
                ]);
                $student->save();
                $success_output = '<div class="alert alert-success">Data Inserted</div>';
            

            if($request->get('button_action') == 'update')
            
                $student = Student::find($request->get('student_id'));
                $student->first_name = $request->get('first_name');
                $student->last_name = $request->get('last_name');
                $student->save();
                $success_output = '<div class="alert alert-success">Data Updated</div>';
            

        
        $output = array(
            'error'     =>  $error_array,
            'success'   =>  $success_output
        );
        echo json_encode($output);
    

    function fetchdata(Request $request)
    
        $id = $request->input('id');
        $student = Student::find($id);
        $output = array(
            'first_name'    =>  $student->first_name,
            'last_name'     =>  $student->last_name
        );
        echo json_encode($output);
    

    function removedata(Request $request)
    
        $student = Student::find($request->input('id'));
        if($student->delete())
        
            echo 'Data Deleted';
        
    

    function mas-s-remove(Request $request)
    
        $student_id_array = $request->input('id');
        $student = Student::whereIn('id', $student_id_array);
        if($student->delete())
        
            echo 'Data Deleted';
        
    

web.php:

Route::get('ajaxdata', 'AjaxdataController@index')->name('ajaxdata');
Route::get('ajaxdata/getdata', 'AjaxdataController@getdata')->name('ajaxdata.getdata');

Route::post('ajaxdata/postdata', 'AjaxdataController@postdata')->name('ajaxdata.postdata');

Route::get('ajaxdata/fetchdata', 'AjaxdataController@fetchdata')->name('ajaxdata.fetchdata');
Route::get('ajaxdata/removedata', 'AjaxdataController@removedata')->name('ajaxdata.removedata');
Route::get('ajaxdata/mas-s-remove', 'AjaxdataController@mas-s-remove')->name('ajaxdata.mas-s-remove');

只有删除有效。我也想使用数据表的select-checkbox 属性,但它不起作用,就像这个link 用于选择时的线条颜色但有多个选择。

【问题讨论】:

需要在ajax请求中传递CSRF令牌吗? _token: " csrf_token() " ? 是的,我需要这样做。 Laravel 是 RESTFul 框架,用于更新使用或使用 PUT 方法提交数据,如果您使用 jquery ajax set 方法 PUT 提交表单。也使用 URL postdata/id of record 出现同样的错误。 你能在JSFile中显示你的更新函数吗? 【参考方案1】:

感谢@Alaksandar Jesus Gene,我通过将get 请求更改get 请求解决了这个问题,该请求在web.php 文件和视图相关的脚本代码中对postdata 函数进行。现在它起作用了,我的第二个问题仍未解决。

【讨论】:

【参考方案2】:

你可以试试这个

$(document).on('click', '.edit', function () 

    data = ;
    data.id = $(this).attr("id");
    data.first_name = "User"; //$('#first_name').val();
    data.last_name = "hello"; //$('#last_name').val();
    data.student_id = $(this).attr("id");
    data.action = 'Edit';
    data.button_action = 'update';
    $('#form_output').html('');
    $.ajax(
        url: "route('ajaxdata.fetchdata')",
        method: 'post',
        data: data,
        dataType: 'json',
        success: function (data) 
           // $('#studentModal').modal('show');
           // $('.modal-title').text('Edit Data');
           console.log("data", data);

        ,
        error: function(err)
            console.log("err", err);              
       
    )
);

Route::post('ajaxdata/postdata', 'AjaxdataController@postdata')->name('ajaxdata.postdata');

路由器需要发布请求,但您正在发送 GET 请求。请按图示更改方法

【讨论】:

谢谢,这就是问题所在。你能更新你的答案以便我批准吗? 出了什么问题?如果你已经解决了,请告诉我,因为我已经更新了我的答案 我已经更新了我的答案。请将其标记为正确,因为这是我们经常犯的错误,并且对其他人有用。 我在这里有一个困惑......你正在映射到 url:“route('ajaxdata.fetchdata')”,它指向 GET 请求。但是 url 是 url:"route('ajaxdata.postdata')",我不知道,可能是你发布了更新的代码。 但这不是我的意思,您已经删除了包含正确答案的评论。

以上是关于Laravel更新mysql表返回空数据的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 与 uuid 的多对多关系返回总是空的

Laravel 4 belongsToMany 关系返回空

Laravel 4 - 表单提交以更新 MySQL 表

Laravel hasMany 到复合表返回空数组

Laravel 4:公共函数根据哪个控制器调用它返回空数据或模型数据?

laravel mysql数据库同一页面多表单提交表不更新