Laravel - Как заставить учеников не набирать очки выше максимальной отметки - PullRequest
0 голосов
/ 11 февраля 2020

Я использую Laravel -5,8 для проекта веб-приложения. В проекте у меня есть эти таблицы:

class SubjectCategory extends Model
{   
  protected $table = 'subject_categories';
  protected $fillable = [
              'name',
              'parent_id',
              'max_mark',
          ];

   public function children()
   {
     return $this->hasMany('App\Models\SubjectCategory', 'parent_id');
   }

  public function exams()
  {
    return $this->hasMany('App\Models\Exam');
  }
}

class Exam extends Model
{
  protected $table = 'exams';
  protected $fillable = [
              'subject_category_id',
              'student_id',
              'student_mark',
              'subject_name',
          ];

  public function subjectcategory()
  {
    return $this->belongsTo('App\Models\SubjectCategory','subject_category_id');
  }  
}

SubjectCategory - это иерархическая таблица. Только родитель имеет max_mark

Вот контроллер

public function create()
{
 $categories = SubjectCategory::with('children')->whereNull('parent_id')->get();

return view('exams.create')
        ->with('categories', $categories);
}
public function store(StoreExamRequest $request)
{

    $exam = new Exam();
    $exam->stubject_category_id     = $request->stubject_category_id;
    $exam->student_id              = $student_id;
    $exam->student_mark             = $request->student_mark;
    $exam->save();
        return redirect()->route('exams.index');
}

блэйд вида

<div class="row">
        <div class="col-md-12">
        <!-- general form elements -->
         <div class="card card-secondary">
          <form  method="POST" action="{{route('exams.store')}}">
          @csrf
       <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"> Subject Category:<span style="color:red;">*</span></label>
              <select id="subject_category" class="form-control" name="subject_category_id">
                <option value="">Select Subject Category</option>

                @foreach ($categories as $category)
                  <option disabled="disabled" value="{{ $category->id }}" {{ $category->id == old('category_id') ? 'selected' : '' }}>{{ $category->name }}</option>

                  @if ($category->children)
                    @foreach ($category->children as $child)
                      <option value="{{ $child->id }}" {{ $child->id == old('category_id') ? 'selected' : '' }}>&nbsp;&nbsp;{{ $child->name }}</option>
                    @endforeach
                  @endif
                @endforeach
              </select>
            </div>
          </div>    
            
          <div class="col-12 col-sm-6">
            <div class="form-group">
              <label class="control-label"> Subject Name:<span style="color:red;">*</span></label>
              <input  type="text" name="subject_name" placeholder="Enter Subject Name here" class="form-control">
            </div>
          </div>

          <div class="col-12 col-sm-4">
            <div class="form-group">
              <label class="control-label"> Mark Obtained:</label>
              <input  type="number" name="student_mark" placeholder="Enter Mark Obtained here" class="form-control">
            </div>
          </div>  


       </div>
     </div>
    </div>          
    <!-- /.card-body -->
    <div class="card-footer">
      <button type="submit" class="btn btn-primary">Save</button>
    </div>           
       
    </form>
    </div>
    <!-- /.card -->
   </div>
   <!--/.col (left) -->
  </div>

Предметы классифицированы. Из SubjectCategory родительский субъект имеет дочерние субъекты как дети. Только родительская категория субъекта имеет максимально достижимый балл (максимальная оценка).

Из выпадающего списка Экзамен (subject_category_id) содержатся все дочерние поля из subject_categories. Чего я хочу добиться, так это:

Когда в раскрывающемся списке выбрана категория субъекта, система переходит к таблице экзаменов. Он отображает общую оценку student_mark на основе student_id и subject_category_id.

По каждому предмету накопленная оценка учащегося не может превышать max_mark в родительской subject_category.

Когда пользователь пытается ввести данные в student_mark текстовое поле, приложение добавляет значение в текстовом поле в совокупность студентов. Если результат больше, чем max_mark в subject_categories (SubjectCategory) на основе родительского max_mark, отображается сообщение об ошибке.

Как мне этого добиться?

Спасибо.

1 Ответ

0 голосов
/ 12 февраля 2020

Это достижимо несколькими способами; Вы можете использовать проверку, чтобы предотвратить ввод кем-либо значения, превышающего максимальную отметку, или если они действительно вводят значение, превышающее максимальную отметку, вы просто тихо уменьшаете его до максимальной отметки.

Я бы посоветовал вам взять подход проверки и для этого вам нужно будет использовать пользовательское правило проверки.

Вы можете прочитать документацию о том, как ее создать (https://laravel.com/docs/5.8/validation#custom -validation-rules ), но реализация может выглядеть примерно так:

// Inside a form request (or you could use inline validation in your controller
'student_mark' => [new NotOverMaxMark($this->input('subject_category_id'))]

Тогда само правило может выглядеть примерно так:

<?php

namespace App\Rules;

use App\SubjectCategory;
use Illuminate\Contracts\Validation\Rule;

class NotOverMaxMark implements Rule
{
    private $subjectCategory;

    public function __construct($subjectCategoryId)
    {
        $this->subjectCategory = SubjectCategory::findOrFail($subjectCategoryId);
    }

    public function passes($attribute, $value)
    {
        return $value <= $this->subjectCategory->max_mark;
    }

    public function message()
    {
        return 'The :attribute must not be higher than the max mark.';
    }
}

Выше приведен пример того, как вы можете Для этого вам может понадобиться настроить импорт или реализацию в соответствии с вашими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...