1
0
mirror of https://github.com/robonen/education-project.git synced 2026-03-20 02:44:31 +00:00

Создание, обновление, получение, фильтрация

This commit is contained in:
nikden13
2020-12-04 11:09:57 +07:00
parent 4a8e802c03
commit 45bec16c7f
7 changed files with 266 additions and 0 deletions

View File

@@ -0,0 +1,34 @@
<?php
namespace App\Filters;
class QueryFilter
{
protected $builder;
protected $request;
public function __construct($builder, $request)
{
$this->builder = $builder;
$this->request = $request;
}
public function apply()
{
foreach ($this->filters() as $filter => $value) {
if (method_exists($this, $filter)) {
if (!$value) {
continue;
}
$this->$filter($value);
}
}
return $this->builder;
}
protected function filters()
{
return $this->request->all();
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Filters;
use Carbon\Carbon;
class TimetableFilter extends QueryFilter
{
protected function class($value)
{
$this->builder = $this->builder->where('class_id', $value);
}
protected function teacher($value)
{
$this->builder = $this->builder->where('teacher_id', $value);
}
protected function subject($value)
{
$this->builder = $this->builder->where('type_event', $value);
}
protected function classroom($value)
{
$this->builder = $this->builder->where('classroom', $value);
}
protected function date($value)
{
$start_date = str_replace('/', '-', $value);
$end_date = Carbon::parse($start_date)
->addDays(5)
->format('Y-m-d');
$this->builder = $this->builder->whereBetween('date', [$start_date, $end_date]);
}
}

View File

@@ -0,0 +1,78 @@
<?php
namespace App\Http\Controllers;
use App\Filters\TimetableFilter;
use App\Http\Requests\TimetableRequest;
use App\Models\SchoolClass;
use App\Models\Subject;
use App\Models\Teacher;
use App\Models\Timetable;
use Carbon\Carbon;
use Illuminate\Http\Request;
class TimetableController extends Controller
{
//Получение расписания
public function index(Request $request)
{
$request->validate([
'date' => 'date_format:Y/m/d',
]);
$builder = Timetable::all()->sortBy('timeStart');
$timetables = (new TimetableFilter($builder, $request))->apply()->values();
$answer = [];
for ($i = 0; $i < 6; $i++) {
$date = Carbon::parse($request->input('date'))
->addDays($i)
->format('Y-m-d');
array_push($answer, [$date => $timetables->where('date', $date)->values()]);
}
return response()->json($answer, 200);
}
//Получение расписания
public function show(Timetable $timetable)
{
return response()->json($timetable, 200);
}
//создание расписания
public function store(TimetableRequest $request)
{
foreach($request->input('timetables') as $timetable) {
SchoolClass::findOrFail($timetable['class_id']);
Teacher::findOrFail($timetable['teacher_id']);
Subject::findOrFail($timetable['subject_id']);
Timetable::create($timetable);
}
return response()->json(['message' => 'Timetable was created'], 201);
}
//обновление расписания
public function update(Timetable $timetable, Request $request)
{
$request->validate([
'class_id' => 'required|integer|gt:0',
'teacher_id' => 'required|integer|gt:0',
'subject_id' => 'required|integer|gt:0',
'date' => 'required|date_format:Y/m/d|',
'time_start' => 'required|date_format:H:i',
'time_end' => 'required|date_format:H:i|after:time_start',
]);
SchoolClass::findOrFail($request->input('class_id'));
Teacher::findOrFail($request->input('teacher_id'));
Subject::findOrFail($request->input('subject_id'));
$timetable->update($request->all());
return response()->json(['message' => 'Timetable was updated'], 200);
}
//удаление расписания
public function destroy(Timetable $timetable)
{
$timetable->delete();
return response()->json('', 204);
}
}

View File

@@ -0,0 +1,33 @@
<?php
namespace App\Http\Requests;
class TimetableRequest extends ApiFormRequest
{
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'timetables' => 'required|array',
'timetables.*.class_id' => 'required|integer|gt:0',
'timetables.*.teacher_id' => 'required|integer|gt:0',
'timetables.*.subject_id' => 'required|integer|gt:0',
'timetables.*.date' => 'required|date_format:Y/m/d|',
'timetables.*.time_start' => 'required|date_format:H:i',
//'timetables.*.time_end' => 'required|date_format:H:i|after:time_start',
/*'week' => 'required|array',
'week.*.day' => 'required|array',
'week.*.day.*.class_id' => 'required|integer|gt:0',
'week.*.day.*.teacher_id' => 'required|integer|gt:0',
'week.*.day.*.subject_id' => 'required|integer|gt:0',
'week.*.day.*.date' => 'required|date_format:Y/m/d|',
'week.*.day.*.time_start' => 'required|date_format:H:i',
'week.*.day.*.time_end' => 'required|date_format:H:i|after:time_start',*/
];
}
}

31
app/Models/Timetable.php Normal file
View File

@@ -0,0 +1,31 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Timetable extends Model
{
use HasFactory;
protected $guarded = [
'updated_at',
];
public function teacher()
{
return $this->belongsTo(Teacher::class);
}
public function schoolClass()
{
return $this->belongsTo(SchoolClass::class,'class_id');
}
public function subject()
{
return $this->belongsTo(Subject::class);
}
}