无法在Laravel 6中更新数据库中的数据

时间:2020-04-14 14:33:50

标签: laravel edit

在这里,我已经设置了laravel 6项目,我可以成功地从数据库中插入和获取数据,但是当涉及到从表中更新和删除数据时,由于某种原因,我无法从数据库中更新和删除数据。控制台中显示的错误:

{消息:“从空值创建默认对象”,异常:“ ErrorException”,…} 异常:“ ErrorException” 文件:“ C:\ WinNMP \ WWW \ chillibiz \ app \ Sys \ Http \ Controllers \ StageController.php” 线:52 消息:“从空值创建默认对象” 跟踪:[{文件:“ C:\ WinNMP \ WWW \ chillibiz \ app \ Sys \ Http \ Controllers \ StageController.php”,第52行,…},…]

这是我的代码: StageController.php

<?php


namespace App\Sys\Http\Controllers;

use App\Http\Controllers\Controller;

use Illuminate\Http\Request;

use Illuminate\Support\Str;

use App\Sys\Model\Stage;

class StageController extends Controller
{

    public function index(Request $request)
    {  
        $per_page = $request->per_page ? $request->per_page : 5;
        $sort_by = $request->sort_by;
        $order_by = $request->order_by;
        return response()->json(['stages' => Stage::orderBy($sort_by, $order_by)->paginate($per_page)],200);
    }

    public function store(Request $request)
    {
        $uuid = Str::uuid()->toString();
        $stage= Stage::create([
            'id' => $uuid,
            'code' =>$request->code,
            'name' =>$request->name,
            'description' =>$request->description,
        ]);
        return response()->json(['stage'=>$stage],200);
    }


    public function show($id)                                                                                                                                                           
    {
        $stages = Stage::where('code','LIKE', "%$id%")->orWhere('name','LIKE', "%$id%")->orWhere('description', 'LIKE', "%$id%")->paginate();
        return response()->json(['stages' => $stages],200);
    }



    public function update(Request $request, $id)
    {


       $stage = Stage::find($id);

       $stage->code  = $request->code;//line 52
       $stage->name  = $request->name;
       $stage->description  = $request->description;


       $stage->save(); 
       return response()->json(['stage'=>$stage], 200);
    }

    public function destroy($id)
    {
        $stage = Stage::where('id', $id)->delete();
        return  response()->json(['stage'=> $stage],200);
    }



    public function deleteAll(Request $request){
        Stage::whereIn('id', $request->stages)->delete();
        return response()->json(['message', 'Records Deleted Successfully'], 200);
    }
}

Stage.php

<?php

namespace App\Sys\Model;

use Illuminate\Database\Eloquent\Model;

class Stage extends Model
{
    protected $guarded = [];
}

api.php

<?php

use Illuminate\Http\Request;



Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});

Route::namespace('App\Sys\Http\Controllers')->group(function () {
    Route::get('/menuslevel0',['uses' => 'MenuController@menus_level_0']);


});

Route::namespace('App\Sys\Http\Controllers')->group(function () {
    Route::resource('stages','StageController');
});

Stage.vue

<template>
<v-app id="inspire">
  <v-data-table 
    item-key="code" 
    class="elevation-1" 
    color="error"
    :loading = "loading"
    loading-text="Loading... Please wait"
      :headers="headers"
    :options.sync="options"
    :server-items-length="stages.total"
    :items="stages.data"
    show-select
    @input="selectAll"
    :footer-props="{
      itemsPerPageOptions: [5,10,15],
      itemsPerPageText: 'Roles Per Page',
      'show-current-page': true,
      'show-first-last-page': true
    }"
  >

    <template v-slot:top>

      <v-toolbar flat color="dark">
        <v-toolbar-title>My Stage</v-toolbar-title>
        <v-divider
          class="mx-4"
          inset
          vertical
        ></v-divider>
        <v-spacer></v-spacer>

        <v-dialog v-model="dialog" max-width="500px">
          <template v-slot:activator="{ on }">
            <v-btn color="error" dark class="mb-2" v-on="on">Add New Stage</v-btn>
            <v-btn color="error" dark class="mb-2 mr-2" @click="deleteAll">Delete</v-btn>
          </template>

          <v-card>
            <v-card-title>
              <span class="headline">{{ formTitle }}</span>
            </v-card-title>

            <v-card-text>
              <v-container>
                <v-row>
                  <v-col cols="12" sm="12" >
                    <v-text-field autofocus color="error" v-model="editedItem.code" label="Code"></v-text-field>
                  </v-col>

                   <v-col cols="12" sm="12" >
                    <v-text-field autofocus color="error" v-model="editedItem.name" label="Name"></v-text-field>
                  </v-col>

                   <v-col cols="12" sm="12" >
                    <v-text-field autofocus color="error" v-model="editedItem.description" label="Description"></v-text-field>
                  </v-col>

                </v-row>

              </v-container>
            </v-card-text>

            <v-card-actions>
              <v-spacer></v-spacer>
              <v-btn color="error darken-1" text @click="close">Cancel</v-btn>
              <v-btn color="error darken-1" text @click="save">Save</v-btn>
            </v-card-actions>


          </v-card>
        </v-dialog>
      </v-toolbar>




    </template>


    <template v-slot:item.action="{ item }">
      <v-icon
        small
        class="mr-2"
        @click="editItem(item)"
      >
        mdi-content-save-edit-outline
      </v-icon>
      <v-icon
        small
        @click="deleteItem(item)"
      >
        mdi-delete
      </v-icon>
    </template>


    <template v-slot:no-data>
      <v-btn color="error" @click="initialize">Reset</v-btn>
    </template>

  </v-data-table>


    <v-snackbar v-model="snackbar" >
               {{text}}
                <v-btn
                  color="error"
                  text
                  @click="snackbar = false"
                >
                  Close
                </v-btn>
              </v-snackbar>    
</v-app>
</template>


<script>
  export default {
    data: () => ({
      dialog: false,
      loading: false,
      snackbar: false,
      selected: [],
      text: '',
      options:{
        itemsPerPage: 5,
        sortBy:['id'],
        sortDesc: [false]
      },
      headers: [
        {text: '#',align: 'left', sortable: false,value: 'id'},
        { text: 'Code', value: 'code' },
        { text: 'Name', value: 'name' },
        { text: 'Description', value: 'description' },   
        { text: 'Actions', value: 'action'},
      ],
      stages: [],
      editedIndex: -1,
      editedItem: {
        id: '',
        code: '',
        name: '',
        description: '',
      },
      defaultItem: {
      id: '',
        code: '',
        name: '',
        description: '',
      },
    }),

    computed: {
      formTitle () {
        return this.editedIndex === -1 ? 'New Stage' : 'Edit Stage'
      },
    },

    watch: {
      dialog (val) {
        val || this.close()
      },
      options:{
        handler(e){
        console.dir(e);
        const sortBy = e.sortBy.length>0 ? e.sortBy[0].trim() : 'id';
        const orderBy = e.sortDesc[0] ? 'desc' : 'asc';
        axios.get(`/api/stages`,{params:{'page':e.page, 'per_page':e.itemsPerPage, 'sort_by': sortBy, 'order_by': orderBy}})
          .then(res => {
            this.stages = res.data.stages
          })

        },
        deep: true
      }
    },

    created () {
      this.initialize()
    },

    methods: {
      selectAll(e){
        this.selected = [];
        if(e.length > 0){
          this.selected = e.map(val => val.id)
        }
      },
      deleteAll(){
        let decide = confirm('Are you sure you want to delete these items?')
        if(decide){
             axios.post('/api/stages/delete', {'stages': this.selected})
            .then(res => {
                this.text = "Records Deleted Successfully!";
                this.selected.map(val => {
                   const index = this.stages.data.indexOf(val)
                   this.stages.data.splice(index, 1)
                })
               this.snackbar = true
            }).catch(err => {
              console.log(err.response)
              this.text = "Error Deleting Record"
              this.snackbar=true
            })
        }        
      },
      searchIt(e){
        if(e.length > 3){
          axios.get(`/api/stages/${e}`)
              .then(res => this.stages = res.data.stages)
              .catch(err => console.dir(err.response))
        }
        if(e.length<=0){
          axios.get(`/api/stages`)
              .then(res => this.stages = res.data.stages)
              .catch(err => console.dir(err.response))
        }
      },
      paginate(e){
        const sortBy = e.sortBy.length>0 ? e.sortBy[0].trim() : 'code';
        const orderBy = e.sortDesc[0] ? 'desc' : 'asc';
        axios.get(`/api/stages`,{params:{'page':e.page, 'per_page':e.itemsPerPage, 'sort_by': sortBy, 'order_by': orderBy}})
          .then(res => {
            this.stages = res.data.stages
          })

      },
      initialize () {
        // Add a request interceptor
        axios.interceptors.request.use((config) => {
            this.loading = true;
            return config;
          },  (error) => {
            this.loading = false;
            return Promise.reject(error);
          });
        // Add a response interceptor
        axios.interceptors.response.use( (response) => {
           this.loading = false;
            return response;
          },  (error) => {
           this.loading = false
            return Promise.reject(error);
          });

      },

      editItem (item) {
        this.editedIndex = this.stages.data.indexOf(item)
        this.editedItem = Object.assign({}, item)
        this.dialog = true
      },
      deleteItem (item) {
        const index = this.stages.data.indexOf(item)
        let decide = confirm('Are you sure you want to delete this item?')
        if(decide){
             axios.delete('/api/stages/'+item.id)
            .then(res => {
                this.text = "Record Deleted Successfully!";
                this.snackbar = true
                this.locations.data.splice(index, 1)
            }).catch(err => {
              console.log(err.response)
              this.text = "Error Deleting Record"
              this.snackbar=true
            })
        }


      },

      close () {
        this.dialog = false
        setTimeout(() => {
          this.editedItem = Object.assign({}, this.defaultItem)
          this.editedIndex = -1
        }, 300)
      },

      save () {

        if (this.editedIndex > -1) {
          const index = this.editedIndex
          axios.put('/api/stages/'+this.editedItem.id, {'code': this.editedItem.code, 'name': this.editedItem.name, 'description': this.editedItem.description})
          .then(res => {
            this.text = "Record Updated Successfully!";
            this.snackbar = true;
            Object.assign(this.stages.data[index], res.data.stage)

          })
          .catch(err => {
            console.log(err.response)
             this.text = "Error Updating Record"
              this.snackbar=true
          })
          // Object.assign(this.stages[this.editedIndex], this.editedItem)
        } else {
           axios.post('/api/stages',{'code': this.editedItem.code, 'name': this.editedItem.name, 'description': this.editedItem.description})
          .then(res =>  {
            this.text = "Record Added Successfully!";
            this.snackbar=true;
            this.stages.data.push(res.data.stage)
          })
          .catch(err => {
            console.dir(err.response)
             this.text = "Error Inserting Record"
              this.snackbar=true
          })

        }
        this.close()
      },
    }, 
  }
</script>
<style scoped></style>

0 个答案:

没有答案