Таблица не показывает данные из базы данных в компоненте laravel vue - PullRequest
0 голосов
/ 14 июня 2019

В течение последних нескольких дней я следовал учебному пособию по применению VUE от действительно хорошего youtuber. Я следовал за каждым шагом, как было упомянуто в учебнике, когда внезапно я внезапно остановился. Это потому, что данные из моей базы данных не отображаются в веб-интерфейсе. База данных показывает, что я правильно храню данные, и никаких ошибок нет. Видео, на котором я застрял: https://youtu.be/bUXhGw4aQtA

Вот код для индекса в моем контроллере

public function index()
    {
        return User::latest()->paginate(10);
    }

Вот приложение.js

/**
 * First we will load all of this project's JavaScript dependencies which
 * includes Vue and other libraries. It is a great starting point when
 * building robust, powerful web applications using Vue and Laravel.
 */

require('./bootstrap');

window.Vue = require('vue');
import {
  Form,
  HasError,
  AlertError
} from 'vform'

window.Form = Form;
Vue.component(HasError.name, HasError)
Vue.component(AlertError.name, AlertError)

import VueRouter from 'vue-router'
Vue.use(VueRouter)

let routes = [{
    path: '/dashboard',
    component: require('./components/Dashboard.vue').default
  },
  {
    path: '/profile',
    component: require('./components/Profile.vue').default
  },
  {
    path: '/users',
    component: require('./components/Users.vue').default
  }
]

const router = new VueRouter({
  mode: 'history',
  routes // short for `routes: routes`
})

/**
 * The following block of code may be used to automatically register your
 * Vue components. It will recursively scan this directory for the Vue
 * components and automatically register them with their "basename".
 *
 * Eg. ./components/ExampleComponent.vue -> <example-component></example-component>
 */

// const files = require.context('./', true, /\.vue$/i);
// files.keys().map(key => Vue.component(key.split('/').pop().split('.')[0], files(key).default));

Vue.component('example-component', require('./components/ExampleComponent.vue').default);

/**
 * Next, we will create a fresh Vue application instance and attach it to
 * the page. Then, you may begin adding components to this application
 * or customize the JavaScript scaffolding to fit your unique needs.
 */

const app = new Vue({
  el: '#app',
  router
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.5.17/vue.js"></script>
<template>
    <div class="container">
           <div class="row mt-5">
          <div class="col-md-12">
            <div class="card">
              <div class="card-header">
                <h3 class="card-title">Users Table</h3>

                <div class="card-tools">
                    <button class="btn btn-success" data-toggle="modal" data-target="#addNew">Add new <i class="fas fa-user-plus"></i></button>
                </div>
              </div>
              <!-- /.card-header -->
              <div class="card-body table-responsive p-0">
                <table class="table table-hover">
                  <tbody>
                    <tr>
                        <th>ID</th>
                        <th>Name</th>
                        <th>Email</th>
                        <th>Type</th>
                        <th>Registered At</th>
                        <th>Modify</th>
                  </tr>


                  <tr v-for="user in users.data" :key="user.id">


                    <td>{{user.id}}</td>
                    <td>{{user.name}}</td>
                    <td>{{user.email}}</td>
                    <td>{{user.type | upText}}</td>
                    <td>{{user.created_at | myDate}}</td>

                    <td>
                          <a href="#" >
                              <i class="fa fa-edit blue"></i>
                          </a>
                          /
                          <a href="#">
                              <i class="fa fa-trash red"></i>
                          </a>
                      </td>
                    </tr>
                </tbody>
                </table>                  
              </div>
            </div>
            <!-- /.card -->
          </div>
        </div>
        <!-- Modal -->
        <div class="modal fade" id="addNew" tabindex="-1" role="dialog" aria-labelledby="addNewLabel" aria-hidden="true">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                <div class="modal-header">
                    <h5 class="modal-title" id="addNewLabel">Add Users</h5>
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                    <span aria-hidden="true">&times;</span>
                    </button> 
                </div>
                <form @submit.prevent="createUser">
                <div class="modal-body">
                    <div class="form-group">
                      <input v-model="form.name" type="text" name="name"
                        placeholder="Name"
                        class="form-control" :class="{ 'is-invalid': form.errors.has('name') }">
                      <has-error :form="form" field="name"></has-error>
                    </div>

                    <div class="form-group">
                      <input v-model="form.email" type="text" name="email"
                        placeholder="email"
                        class="form-control" :class="{ 'is-invalid': form.errors.has('email') }">
                      <has-error :form="form" field="email"></has-error>
                    </div>

                    <div class="form-group">
                      <textarea v-model="form.bio" type="text" name="bio"
                        placeholder="Bio"
                        class="form-control" :class="{ 'is-invalid': form.errors.has('bio') }"></textarea>
                      <has-error :form="form" field="bio"></has-error>
                    </div>

                    <div class="form-group">
                      <select v-model="form.type" type="text" name="type"
                        class="form-control" :class="{ 'is-invalid': form.errors.has('type') }">
                        <option value="">Select user Role</option>
                        <option value="user">Employee</option>
                        <option value="manager">Manager</option>
                      </select>
                      <has-error :form="form" field="name"></has-error>
                    </div>

                    <div class="form-group">
                      <input v-model="form.password" type="password" name="password"
                        placeholder="password"
                        class="form-control" :class="{ 'is-invalid': form.errors.has('password') }">
                      <has-error :form="form" field="password"></has-error>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
                    <button type="submit" class="btn btn-primary">Create</button>
                </div>

                </form>
                </div>
            </div>
            </div>            
    </div>
</template>

<script>
  export default {
    data() {
      return {
        users: {},
        form: new Form({
          name: '',
          email: '',
          password: '',
          type: '',
          bio: '',
          photo: '',
        })
      }
    },
    methods: {
      loadUsers() {
        axios.get("api/user").then(({
          data
        }) => (this.user = data));
      },
      createUser() {
        this.form.post('api/user');
      }
    },
    created() {
      this.loadUsers();
    }
  }
</script>

Пожалуйста, дайте мне знать, если мне потребуется какой-либо другой код для уточнения запроса, который у меня здесь. Я перепробовал все варианты, которые мог придумать и найти, и не смог заставить его работать. Надеюсь, еще один взгляд поможет мне разобраться в проблеме.

Я ожидаю полную таблицу, показывающую все строки из моей базы данных, а интерфейс ничего не показывает. (Примечание: я проверял вкладку сети в настройках разработчика в Chrome, и был только один тип xhr, и он показывал статус 200).

Ответы [ 2 ]

1 голос
/ 15 июня 2019

Я предлагаю вам зайти на youtube для поиска учебных пособий по laravel / vue, там есть множество хороших ресурсов, которые могут вам помочь. Для того, что вы пытаетесь достичь, если вы хорошо смонтировали свой компонент и видите фиктивный тест в компоненте в своем браузере, то вы уже на полпути. Внутри вашего подключенного хука вашего компонента vue сделайте вызов API для вашего бэкэнда (laravel), чтобы получить таких пользователей:

axios.get('/get_all_users').then((res)=>{
  this.users = res.data
  //do a console.log(res.data) to ensure you are getting the users collection
}).catch((err) => {
  console.log(err)
});

Внутри вашего объекта данных создайте пустой массив, который будет содержать ваших пользователей таким образом;

data(){
  return{
    users: []
  }
}

Теперь внутри вашего web.php создайте GET-маршрут для этого вызова API;

ROUTE::get('/get_all_users', 'UsersController@FetchUsers');

Обратите внимание, что ваш контроллер и метод не обязательно должны иметь имя, как указано выше, создайте контроллер, а внутри напишите метод для извлечения пользователей и использования их здесь как можно скорее; Внутри вашего контроллера напишите свой метод;

public function FetchUsers(){
  $users = User::latest()->get();
  return response()->json($users, 200);
}

Также обратите внимание, что вам нужно будет импортировать вашу модель User в верхней части файла контроллера, например так:

use App\User;

Также убедитесь, что у вас уже есть созданная модель пользователя, которая относится к вашей таблице пользователей; К настоящему времени вы должны увидеть массивы пользователей в консоли инструментов браузера вашего разработчика, если все в порядке. Затем в вашем шаблоне итерируйте данные пользователей следующим образом:

<tr v-for="user in users" :key="user.id">
  <td>{{ user.id }} </td>
  <td>{{ user.name }} </td>
  <td>{{ user.email }} </td>
  <td>{{ user.created_at }} </td>
</tr>

Я буду рад помочь, если вам понадобятся дальнейшие разъяснения.

1 голос
/ 15 июня 2019

Вам необходимо вернуть ваши данные как json.Вы можете использовать Laravel [Resource] (https://laravel.com/docs/5.8/eloquent-resources)

Создать пользовательский ресурс

php artisan make:resource User

Пользовательский контроллер

use App\Http\Resources\User as UserResource;

В вашем методе

$user = User::latest()->paginate(10);
return UserResource::collection($user)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...