Используя проект Laravel -5.8, у меня есть эта таблица:
CREATE TABLE `appraisal_goal_types` (
`id` int(11) NOT NULL,
`name` varchar(200) NOT NULL,
`parent_id` int(11) DEFAULT NULL,
`max_score` int(11) DEFAULT 0,
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Из таблицы, если parent_id равен нулю, тогда строка является родительской. Каждое дочернее поле будет иметь свой parent_id. Родитель может иметь много дочерних строк. Кроме того, только родитель может иметь значение для max_score. У дочернего элемента будет 0 по умолчанию для max_score
. В моем блэйде просмотра у меня есть раскрывающийся список, который будет заполняться только дочерними полями.
Я написал эту функцию в моем контроллере
public function maxScore(Request $request)
{
$userCompany = Auth::user()->company_id;
$type = AppraisalGoalType::where('company_id', $userCompany)->with('parent')->find($request->id);
$maxScore = $type->max_score ?:$type->parent->max_score ;
return response()->json([
'maxscore' => $maxScore,
]);
}
public function create()
{
$userCompany = Auth::user()->company_id;
$userEmployee = Auth::user()->employee_id;
$identities = DB::table('appraisal_identity')->select('id','appraisal_name')->where('company_id', $userCompany)->where('is_current', 1)->first();
$goaltypes = AppraisalGoalType::where('company_id', $userCompany)->get();
$categories = AppraisalGoalType::with('children')->where('company_id', $userCompany)->whereNull('parent_id')->get();
return view('appraisal.appraisal_goals.create')
->with('goaltypes', $goaltypes)
->with('categories', $categories)
->with('identities', $identities)
;
}
Модель
class AppraisalGoalType extends Model
{
protected $table = 'appraisal_goal_types';
protected $primaryKey = 'id';
protected $fillable = [
'name',
'company_id',
'parent_id',
'max_score',
];
protected $casts = [];
public function children()
{
return $this->hasMany('App\Models\Appraisal\AppraisalGoalType', 'parent_id');
}
public function parent()
{
return $this->belongsTo(App\Models\Appraisal\AppraisalGoalType::class, 'parent_id');
}
}
Я отправляю max_score как json.
route / web. php
Route::get('appraisal_goals/maxScore', 'Appraisal\AppraisalGoalsController@maxScore')->name('appraisal.appraisal_goals.maxScore');
create. клинок. php
<form action="{{route('appraisal.appraisal_goals.store')}}" method="post" class="form-horizontal" enctype="multipart/form-data">
{{csrf_field()}}
<div class="card-body">
<div class="form-body">
<div class="row">
<div class="col-12 col-sm-6">
<div class="form-group">
<label class="control-label"> Goal Type:<span style="color:red;">*</span></label>
<select id="goal_type" class="form-control" name="goal_type_id">
<option value="">Select Goal Type</option>
@foreach ($categories as $category)
@unless($category->name === 'Job Fundamentals')
<option hidden value="{{ $category->id }}" {{ $category->id == old('category_id') ? 'selected' : '' }}>{{ $category->name }}</option>
@if ($category->children)
@foreach ($category->children as $child)
@unless($child->name === 'Job Fundamentals')
<option value="{{ $child->id }}" {{ $child->id == old('category_id') ? 'selected' : '' }}> {{ $child->name }}</option>
@endunless
@endforeach
@endif
@endunless
@endforeach
</select>
</div>
</div>
<input type="text" id="max_score" value="max_score" class="form-control" >
</form>
<script type="text/javascript">
$(document).ready(function(){
$("#goal_type").on('change', function postGoalType(){
var goal_type_id = $(this).val();
$.ajax({
url: 'maxScore', //your endpoint
data: { goal_type_id: goal_type_id }, //data being passed
type: 'get'
}).done(function(responseData) {
$('#max_score').val(responseData.maxscore); //populate the max_score input
}).fail(function() {
console.log('Failed');
});
});
});
</script>
Когда выбрано дочернее поле, я хочу загрузить max_score его родителя.
Функция maxScore в контроллере заключается в выборе max_score для родитель запрошенного идентификатора дочернего элемента.
Однако, когда я нажимаю на раскрывающееся меню, чтобы загрузить max_score родительского элемента с соответствующим target_type_id, я получаю эту ошибку в консоли:
GET http://localhost: 8888 / appraisal_goals / maxScore? Goal_type_id = 3 404 (не найден)
Как мне его решить?
Спасибо.