Laravel 中的动态相关下拉列表

Posted

技术标签:

【中文标题】Laravel 中的动态相关下拉列表【英文标题】:Dynamic Dependent Drop Down List In Laravel 【发布时间】:2020-06-29 22:32:42 【问题描述】:

我在名为 productdetailscategoriessubcategorydetails 的数据库中有 3 个不同的表,同样我有 3 个不同的控制器 ProductdetailContoller em>,CategoryController & SubcategorydetailController。 目前,我正在研究 SubcategorydetailContoller 的“视图”,即 subcategory.blade.php

`

            @csrf
            <div class="form-group">

              <select name="productid">


                <option value="select product">
                @foreach ($productdetail as $row)
                  <option value="$row->ProductID">
                    $row->ProductType
                  </option>
                  @endforeach
                  </option>
              </select>

              <select name="categoryid">


                <option value="select category">
                @foreach ($category as $row)
                  <option value="$row->CategoryID">
                    $row->CategoryType

                  </option>
                  @endforeach
                  </option>
              </select>

              <input type="text" name="subcategory"/>

              <input type="submit" value="add category"/>
            </div>
          </form>
        </div>`

现在我想制作动态相关的下拉列表,但在为此工作之前,我无法将第二个表的数据显示到第二个下拉列表中。

这是我在控制器中所做的:

namespace App\Http\Controllers;
use App\productdetail;
use App\category;
use App\subcategorydetail;
use Illuminate\Http\Request;

class SubcategorydetailController extends Controller


    public function index()
      

       $productdetails=productdetail::all();
        return view('subcategory')->with('productdetail',$productdetails);

        //i wrote this in another class but i still didn't get the desired output
        $category=category::all();
        return view('subcategory')->with('category', $category);

    



    public function create()
    

    


    public function store(Request $request)
    
        $data=new subcategorydetail();
        $data->SubCatType=$request->subcategory;
        $data->CategoryID=$request->categoryid;
        $data->save();
        return dd($data);
        //return view('subcategory');
    

更新 1: 现在我使用此代码在第二个下拉菜单中获取数据

 public function index()
    

        $productdetail=productdetail::all();

        $category=category::all();

            /*$category=category::where(DB::table('categories')
            ->join('productdetails','categories.ProductID','=','productdetails.ProductID')
                ->select('categories.CategoryType')
            //->whereRaw('categories.ProductID="1"')
            ->get());*/
            return view('subcategory')->with([
                'productdetail'=>$productdetail,
                'category' => $category,

        ]);


    

现在我没有明白我在加入和建立逻辑时做错了什么>

更新 2:

public function index(Request $request)
    

        $productdetail=productdetail::all();

        $data=new productdetail();
        $data=new productdetail();
        $data->ProductID=$request->productid;
        $category=category::where(DB::table('categories')
            ->join('productdetails','categories.ProductID','=','productdetails.ProductID')
             ->select('categories.CategoryType')
            ->whereRaw('categories.ProductID='.$data.'')
            ->get());

        return view('subcategory')->with([
            'productdetail'=>$productdetail,
            'category' => $category,

        ]);


    

上面的代码显示了这个错误:

SQLSTATE[42000]: 语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以在第 1 行的“ProductID”附近使用正确的语法(SQL:select categories.CategoryType from categories inner join productdetails on @987654329 @.ProductID = productdetails.ProductID where categories.ProductID="ProductID":null)

【问题讨论】:

//i wrote this in another class but i still didn't get the desired output 对此的预期输出是什么?首先我们需要解决第一个问题才能进入第二个问题 当我在第一个下拉菜单中选择产品时,它应该在第二个下拉菜单中显示该特定产品的类别。 要么一次返回所有结果,要么在用户从第一个下拉列表中选择内容时发出 ajax 请求以获取第二个下拉列表的选项。您将需要两种方式的 javascript,而您还没有编写任何代码。尝试使用 javascript 并编辑问题 好吧,我必须在不使用 ajax 或 jquery 的情况下这样做。 html 本身不提供此类选项。您将需要 javascript 来控制流程。一种解决方案是:在您的路线上添加productDetail,在控制器上,您只需要获取与该产品详细信息$category=category::where(...); // use the productDetail in here 有任何关系的类别 【参考方案1】:

HTML 不提供与您在 cmets 中讨论的功能。

你可以这样做:

在您的路线文件中

Route::get('productDetail', 'SubcategorydetailController@index');

关于您的控制器操作

 public function index()
      

       $productdetails=productdetail::all();

       $category=category::where(...); // insert the logic to return only the categories that has anything to do with this product detail
        return view('subcategory')->with([
          'category' => $category,
          'productDetail' => $productDetails,
        ]);

    

【讨论】:

productDetail 为什么我们在路由中使用它?这条线实际上在做什么? 'productDetail' => $productDetails??? productDetail 将获取该路由的第一个参数。假设您有以下路线:1/foo/bar, productDetail = 1 这里。第二行是方法'with'接受一个关联数组 好吧,我的第二个下拉列表在不使用 poductDetail 的情况下获取数据;按照您的指南,我的一半问题得到了解决。现在,我无法建立第二个下拉列表对第一个下拉列表的依赖 你能一步一步描述你需要什么吗?据我了解,这应该会发生:1. 用户从第一个下拉列表中选择一些内容 2. 第二个下拉列表已更新,仅显示与第一个下拉列表相关的选项 这正是我所需要的。我的问题是,第二个下拉列表显示所有数据不依赖于第一个下拉列表。我更新了我的问题,在上一节中我展示了我是如何“加入”的。

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

laravel - 基于先前选择的动态下拉列表

如何在 Laravel 中制作简单的动态下拉列表?

Codeigniter 上的动态相关下拉列表国家和州

nodejs mysql中的动态下拉列表

Laravel 中的动态相关下拉选择

laravel 5.4 数据库中的表单下拉列表