【问题标题】:Laravel dynamic dropdown base on hasMany relationships基于 hasMany 关系的 Laravel 动态下拉列表
【发布时间】:2018-09-05 15:43:25
【问题描述】:

我正在尝试创建一个动态的两个动态下拉菜单。这些是从我的数据库中选择的服务和类别。我需要制作第二个下拉菜单,它是依赖于服务的类别。当我选择 [service_code] 时,它将根据所选服务提供不同的类别。

这是两个模型之间的关系。

Service.php

public function categories()
        {
            return $this->hasMany('App\Models\Categories', 'service_id', 'id');
        }

Categories.php

public function service()
    {
        return $this->belongsTo('App\Models\Service', 'service_id');
    }

这是我控制器中的代码

AnalysisRequestController.php

public function create()
    {
        $client = Client::all()->sortBy('client_name', SORT_NATURAL | SORT_FLAG_CASE)->pluck('client_name', 'id');
        $services = Service::with('categories')->get()->sortBy('code', SORT_NATURAL | SORT_FLAG_CASE)->pluck('description', 'id');
        $categories = Categories::with('service')->get()->sortBy('name', SORT_NATURAL | SORT_FLAG_CASE)->pluck('name', 'id');

        return view('encoder-dashboard.analysis-request.create', compact('client', 'services', 'categories'));
    }

这是我认为的代码

fields.blade.php

<!-- Service Id Field -->
<div class="form-group col-sm-6">
    {!! Form::label('service_id', 'Service:') !!}
     {!! Form::select('service_id', $services, null, ['class' => 'form-control','required'])!!}
</div>

<!-- Categories Id Field -->
<div class="form-group col-sm-6">
    {!! Form::label('category_id', 'Category:') !!}
     {!! Form::select('category_id', $categories, null, ['class' => 'form-control','required'])!!}
</div>

这是我的请求脚本部分

<script>
        $(function() {
            $('select[name=service_id]').change(function() {

                var url = '{{ url('service') }}' + $(this).val() + '/categories/';

                $.get(url, function(data) {
                    var select = $('form select[name= category_id]');

                    select.empty();

                    $.each(data,function(key, value) {
                        select.append('<option value=' + value.id + '>' + value.name + '</option>');
                    });
                });
            });
        });
    </script>

这里是定义的路线

Route::get('service/{service}/categories', 'ServiceController@getCategories');

最后是控制器中的函数

ServiceController.php

public function getCategories(Service $service)
    {
        return $service->categories->select('id', 'name')->get();
    }

当我在浏览器中打开控制台时,出现此错误。

GET http://127.0.0.1:8000/service/3/categories/ 404(未找到)

我尝试按照link 中的答案进行操作,但仍然无法正常工作..

如果有人可以提供帮助,不胜感激。

提前致谢。

【问题讨论】:

  • 问题出在哪里?有什么错误吗?
  • 你能告诉我你现在遇到了什么问题吗?
  • @HasanTıngır 没有显示错误,但我想根据我在第一个下拉列表中选择的服务填充第二个下拉列表
  • 更新问题@HasanTıngır
  • 你能看一下错误日志吗? (storage/logs/laravel.log) 希望我们能找到更多信息是什么导致了这个错误

标签: php laravel laravel-5 laravel-5.5


【解决方案1】:

路由参数是一个ID,而不是一个对象。您必须自己获取模型实例。

所以getCategories() 应该是这样的:

public function getCategories($idService)
{
    $service = Service::findOrFail($idService);
    return $service->categories->get(['id','name']);;
}

编辑:如果 url 中的 id 不是数字,为避免出现错误 500(例如:http://127.0.0.1:8000/service/someText/categories/,请在方法的开头添加一个简单的检查:

if(!is_numeric($idService)) abort(404);

【讨论】:

  • 我收到 500 内部服务器错误?我会在我定义的路线中做出任何改变吗?
  • 如果您有任何错误,请告诉我们确切的错误。您可以通过storage/logs/laravel.log 获取它们。你的路线没问题,不用改。
  • 我添加了它,但仍然遇到相同的 500 内部服务器错误。
  • 请告诉我们错误的详细信息,否则我们无法帮助您。
  • 是这个吗?在控制台日志中{消息:“方法选择不存在。”,异常:“BadMethodCallException”,...}异常:“BadMethodCallException”文件:“/home/jayzyaj/Documents/CrisDMS/dms-server/vendor/laravel/framework /src/Illuminate/Support/Traits/Macroable.php”行:96 消息:“方法选择不存在。”
猜你喜欢
  • 2016-02-13
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-01
  • 1970-01-01
  • 2016-08-25
相关资源
最近更新 更多