首页 > 解决方案 > laravel when() 辅助函数在值为 false 时执行函数

问题描述

public function getStudents(Request $request)
   {
       return User::where('role','student')
           ->where('is_enrolled',false)
           ->when(request('category') != 0, function ($q){
               $q->where('category_id',request('category'));
           })
           ->when($request->sort != 0, function ($q) use ($request){
               $o = explode('#',$request->sort);
               $q->orderBy($o[0], $o[1]);
           })
           ->with('category')
           ->paginate(5);
   }

我正在使用 laravel when() 函数,它在第一个函数中运行良好,但是当涉及到第二个函数时

->when($request->sort != 0, function ($q) use ($request){
                $o = explode('#',$request->sort);
                $q->orderBy($o[0], $o[1]);
            })

它在 $request->sort 等于 0 时执行该函数,我使用 vue.js 和 axios 发送请求。

html代码是

<div id='root'>
<div class="col-2">
                <select class="form-select font-type" aria-label=".form-select-sm example" v-model="category">
                    @if ($categories->count())
                        <option selected value="0">All</option>
                        @foreach ($categories as $cat)
                            <option value="{{$cat->id}}">{{$cat->title}}</option>
                        @endforeach
                    @else
                        <option SELECTED DISABLED value="0">No Category found</option>
                    @endif
                </select>
            </div>
            <div class="col-3">
                <div class="row align-items-baseline">
                    <div class="col-10">
                        <select class="form-select font-type" aria-label=".form-select-sm example" v-model="sort">
                            <option selected value="0">
                                filter
                            </option>
                            <option value="name#ASC">name - ascending</option>
                            <option value="name#DESC">name - descending</option>
                            <option value="ssn#ASC">ssn - ascending</option>
                            <option value="ssn#DESC">ssn - descending</option>
                        </select>
                    </div>
                    <div class="col-2">
                        <i class="fas fa-filter align-self-center"></i>
                    </div>
                </div>
            </div>
<div class="col-2 d-grid gap-2 font-type">
                <button class="btn btn-primary" @click="applyFilters">
                    Apply filters
                </button>
            </div>
</div>

javascript是

<script>
            var app = new Vue({
                el: '#root',
                data:{
                    students: {},
                    pages: [],
                    sort: 0,
                    category: 0
                },
                mounted(){
                    axios.post('/api/get-students',{
                    })
                        .then(res =>{
                            this.students = res.data.data;
                            this.pages = res.data.links;
                            console.log(res.data.links);
                        })
                },
                methods:{
                    applyFilters(){
                        axios.post('/api/get-students',{
                            sort:this.sort,
                            category:this.category
                        })
                            .then(response => {
                                this.students = response.data.data;
                                this.pages = response.data.links;
                                console.log(response.data.links);
                            });
                    }

                }
            })
        </script>

请注意,当我将 when 条件设置为等于 0 时,它会在重新加载页面时出现 500 内部服务器错误,但是当我单击应用过滤器按钮时,它会给我结果,但是当我将其设置为不等于 0 时,它会给出结果当页面重新加载但过滤器不适用时。提前致谢

标签: laravelvue.jseloquentaxios

解决方案


推荐阅读