Laravel 基于 hasMany 关系的动态下拉列表
Laravel dynamic dropdown base on hasMany relationships
我正在尝试创建一个动态的两个动态下拉菜单。这些是我数据库中的服务和类别 selection。我需要制作第二个下拉菜单,这是依赖于服务的类别。当我 select [service_code] 时,它会根据 selected 服务给出一组不同的类别。
下面是两个模型之间的关系。
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 (Not Found)
我尝试按照此 中的答案进行操作,但仍然无法正常工作..
如果有人能提供帮助,我们将不胜感激。
提前致谢。
路由参数是ID,不是对象。您必须自己获取模型实例。
所以 getCategories()
应该是这样的:
public function getCategories($idService)
{
$service = Service::findOrFail($idService);
return $service->categories->get(['id','name']);;
}
编辑:如果 url 中的 id 不是数字(例如:http://127.0.0.1:8000/service/someText/categories/
,为避免出现错误 500,请在方法开头添加一个简单的检查:
if(!is_numeric($idService)) abort(404);
我正在尝试创建一个动态的两个动态下拉菜单。这些是我数据库中的服务和类别 selection。我需要制作第二个下拉菜单,这是依赖于服务的类别。当我 select [service_code] 时,它会根据 selected 服务给出一组不同的类别。
下面是两个模型之间的关系。
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 (Not Found)
我尝试按照此
如果有人能提供帮助,我们将不胜感激。
提前致谢。
路由参数是ID,不是对象。您必须自己获取模型实例。
所以 getCategories()
应该是这样的:
public function getCategories($idService)
{
$service = Service::findOrFail($idService);
return $service->categories->get(['id','name']);;
}
编辑:如果 url 中的 id 不是数字(例如:http://127.0.0.1:8000/service/someText/categories/
,为避免出现错误 500,请在方法开头添加一个简单的检查:
if(!is_numeric($idService)) abort(404);