Laravel 8 中的动态相关下拉菜单

Posted

技术标签:

【中文标题】Laravel 8 中的动态相关下拉菜单【英文标题】:Dynamic Dependent Dropdown in Laravel 8 【发布时间】:2021-03-04 11:30:08 【问题描述】:

我想根据父类别过滤子类别数据。我在所有类别中都获得了我的所有子类别。我尝试了许多来自 *** 和 youtube 的旧答案,但没有奏效。

我想在我的文章发布表单中使用这个过滤器。

create.article.blade.php

<form action=" URL::to('post-article-form') " method="post" enctype="multipart/form-data">
        @csrf
        <div class="form-group">
            <label for="exampleInputEmail1">Article Name <b style="color: red">*</b></label>
            <input type="text" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter article title" name="articleTitle" required>
        </div>
        <div class="form-group">
            <label for="exampleInputEmail1"> Select Article category </label>
            <select class="form-control" name="category" id="category" required>
                <option value=""> Select </option>
                @foreach($categories as $category)
                    <option value=" $category->id ">  $category->name </option>
                @endforeach
            </select>
        </div>
        <div class="form-group">
            <label for="exampleInputEmail1"> Select Sub category </label>
            <select class="form-control" name="subCategory" id="subCategory" required>
                <option value=""> Select </option>
                @foreach($subCategories as $subCategory)
                    <option value=" $subCategory->id ">  $subCategory->name </option>
                @endforeach
            </select>
        </div>

我想根据父类别过滤子类别数据。我在所有类别中都获得了我的所有子类别。我尝试了许多来自 *** 和 youtube 的旧答案,但没有奏效。

我想在我的文章发布表单中使用这个过滤器。

create.article.blade.php

<form action=" URL::to('post-article-form') " method="post" enctype="multipart/form-data">
        @csrf
        <div class="form-group">
            <label for="exampleInputEmail1">Article Name <b style="color: red">*</b></label>
            <input type="text" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" placeholder="Enter article title" name="articleTitle" required>
        </div>
        <div class="form-group">
            <label for="exampleInputEmail1"> Select Article category </label>
            <select class="form-control" name="category" id="category" required>
                <option value=""> Select </option>
                @foreach($categories as $category)
                    <option value=" $category->id ">  $category->name </option>
                @endforeach
            </select>
        </div>
        <div class="form-group">
            <label for="exampleInputEmail1"> Select Sub category </label>
            <select class="form-control" name="subCategory" id="subCategory" required>
                <option value=""> Select </option>
                @foreach($subCategories as $subCategory)
                    <option value=" $subCategory->id ">  $subCategory->name </option>
                @endforeach
            </select>
        </div>

我使用下面的脚本进行过滤,但没有奏效。我得到相同的结果意味着。选择任意类别后的所有子类别。

<script>
     $('#category').on('change',function(e)
      console.log(e);
      var cat_id = e.target.value;
       //ajax

      $.get('/ajax-subcat?cat_id='+cat_id, function(data)
         //subcategory
        $('#subCategory').empty();
        $('#subCategory').append($("<option></option>").val("").html("--Select Sub Category--"));
        $.each(data,function(index, subcatObj)
       $('#subCategory').append('<option value="'+subcatObj.id+'">'+subcatObj.name+'</option>');
        )
    )
);
</script>

我的 web.php 路由

//sub category
Route::get('add-sub-category', [SubCategoryController::class, 'create']);
Route::post('post-sub-category-form', [SubCategoryController::class, 'store']);
Route::get('subcategories', [SubCategoryController::class, 'index']);

Route::get("/ajax-subcat", function (Request $request)
    $cat_id = $request-> Input::get('cat_id');
    $subCategories = SubCategory::where('category_id',$cat_id)->get();

    return response()->json($subCategories);

    );

【问题讨论】:

【参考方案1】:

我只是为下拉选择添加路线

route::get('dropdownlist/getsubcategories/id', [ArticleController::class , 'getSubCategories']);

创建控制器并调用查询方法根据类别id获取子类别。

public function getCategories()
    
        $categories = DB::table('categories')->pluck("name","id");
        return view('article.create',compact('categories'));
    

    public function getSubCategories($id)

        $subcategories = DB::table("sub_categories")->where("category_id",$id)->pluck("name","id");
        return json_encode($subcategories);

并在资源文件中使用了 Ajax。

create.blade.php

<script type="text/javascript">
            jQuery(document).ready(function ()
            
                    jQuery('select[name="category"]').on('change',function()
                       var categoryID = jQuery(this).val();
                       if(categoryID)
                       
                          jQuery.ajax(
                             url : 'dropdownlist/getsubcategories/' +categoryID,
                             type : "GET",
                             dataType : "json",
                             success:function(data)
                             
                                console.log(data);
                                jQuery('select[name="subCategory"]').empty();
                                jQuery.each(data, function(key,value)
                                   $('select[name="subCategory"]').append('<option value="'+ key +'">'+ value +'</option>');
                                );
                             
                          );
                       
                       else
                       
                          $('select[name="subCategory"]').empty();
                       
                    );
            );
            </script>

【讨论】:

以上是关于Laravel 8 中的动态相关下拉菜单的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 8 中保存嵌套的下拉菜单

如何制作 联想动态下拉菜单

在 Laravel 4 中使用数据库结果填充下拉菜单

使用数据库填充下拉菜单会导致Laravel 4

如何从Laravel中的数据库记录中填充下拉菜单项

带有 jQ​​uery 的 Rails 中的动态下拉(选择框)菜单不可逆