【问题标题】:AJAX Search with Laravel and Vue empty ResultsAJAX 搜索与 Laravel 和 Vue 空结果
【发布时间】:2019-06-30 22:56:47
【问题描述】:

我想用 ajax 和 vue 构建搜索。

所以我的所有文件都有一个名为“文件”的模型

然后我有一个名为 searchcontroller.php 的控制器

public function search(Request $request)
{
    $files = File::where('name', $request->keywords)->get();
    return response()->json($files);
}

这是我的路线

Route::post('/', 'SearchController@search');

我有一个 search.vue

<template>
<div>
    <input type="text" v-model="keywords">
    <ul v-if="results.length > 0">
        <li v-for="result in results" :key="result.id" v-text="result.name"></li>
    </ul>
</div>
</template>
<script>
export default {
    data() {
        return {
            keywords: null,
            results: []
        };
    },

    watch: {
        keywords(after, before) {
            this.fetch();
        }
    },

    methods: {
        fetch() {
            axios.get('/', { params: { keywords: this.keywords } })
                .then(response => this.results = response.data)
                .catch(error => {});
        }

    }

}
</script>

如果我输入一个字母,我认为 resposce 工作,但它显示了 10000 个列表点,结果为空

我想这样做:https://jsfiddle.net/hej7L1jy/2/

如果我这样做:

console.log(this.results);
console.log(this.keywords);

我得到结果:

数组(0)

关键字有效

【问题讨论】:

  • 控制台记录您的结果以检查它们是否甚至具有名称属性
  • 我在帖子中添加了它
  • 收到响应后在 axios 调用中不记录它:)
  • axios.get('/', { params: { keywords: this.keywords } }) .then(response => console.log(response.data)) .catch(error => { });
  • 一旦你记录了 axios 调用的响应,我就会知道我们必须使用的数据结构:)

标签: javascript ajax laravel search vue.js


【解决方案1】:

我明白了:)

控制器:

public function search(Request $request)
{
    $files = DB::table('files')->where('name', 'like', '%' . $request->get('keywords') . '%')->get();
    return response()->json($files);
}

路线:

Route::get('/search', 'SearchController@search');

Vue:

<template>
<div>
    <input type="text" v-model="keywords">
    <ul v-if="results.length > 0">
        <li v-for="result in results" :key="result.id">{{ result.name }}</li>
    </ul>
</div>

</template>

<script>
    export default {
        data() {
            return {
                keywords: null,
                results: []
            };
        },

        watch: {
            keywords(after, before) {
                this.fetch();
            }
        },

        methods: {
            fetch() {
                axios.get('/search', { params: { keywords: this.keywords } })
                    .then(response => this.results = response.data)
                    .catch(error => {});
            }

        }
    }
    </script>

我在控制器中编辑了 where 函数,我需要一个“get”方法,而不是“post”:)

【讨论】:

    【解决方案2】:
    public function search(Request $request)
    {
        $files = File::where('name', 'like', '%' . $request->get('keywords') . '%')->get();
    
        return response()->json($files);
    }
    
    <template>
    <div>
        <input type="text" v-model="keywords">
        <ul v-if="results.length > 0">
            <li v-for="result in results" :key="result.id">{{ result.name }}</li>
        </ul>
    </div>
    </template>
    <script>
    export default {
        data() {
            return {
                keywords: null,
                results: []
            };
        },
    
        watch: {
            keywords(after, before) {
                this.fetch();
            }
        },
    
        methods: {
            fetch() {
                axios.post('/', { params: { keywords: this.keywords } })
                    .then(response => this.results = response.data)
                    .catch(error => {});
            }
    
        }
    }
    </script>
    
    

    【讨论】:

    • 现在我收到此错误:加载资源失败:服务器响应状态为 500(内部服务器错误)
    • 这是您的 php 代码的问题。检查你的 Laravel 日志。
    • 抱歉,我无法提供更多帮助,有几个问题,一次只能解决一个问题。开发者的生活。
    • 这是一个拼写错误,500,现在我没有任何错误,但也没有任何反应:/
    • 您是否在返回响应,并且 axios 使用的是 post 而不是 get?即使它现在是虚假的回应。
    猜你喜欢
    • 2021-09-26
    • 2014-11-28
    • 1970-01-01
    • 2018-01-28
    • 2013-08-03
    • 2021-09-19
    • 2021-03-24
    • 2011-08-27
    • 2015-05-06
    相关资源
    最近更新 更多