mirror of
https://github.com/robonen/education-project.git
synced 2026-03-20 02:44:31 +00:00
Создание, обновление, получение, фильтрация
This commit is contained in:
34
app/Filters/QueryFilter.php
Normal file
34
app/Filters/QueryFilter.php
Normal 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
40
app/Filters/TimetableFilter.php
Normal file
40
app/Filters/TimetableFilter.php
Normal 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]);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
78
app/Http/Controllers/TimetableController.php
Normal file
78
app/Http/Controllers/TimetableController.php
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
33
app/Http/Requests/TimetableRequest.php
Normal file
33
app/Http/Requests/TimetableRequest.php
Normal 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
31
app/Models/Timetable.php
Normal 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
class CreateTimetablesTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::create('timetables', function (Blueprint $table) {
|
||||||
|
$table->id();
|
||||||
|
$table->unsignedInteger('class_id');
|
||||||
|
$table->unsignedInteger('teacher_id');
|
||||||
|
$table->unsignedInteger('subject_id');
|
||||||
|
$table->date('date');
|
||||||
|
$table->time('time_start');
|
||||||
|
$table->time('time_end');
|
||||||
|
$table->string('classroom');
|
||||||
|
$table->timestamps();
|
||||||
|
|
||||||
|
$table->foreign('class_id')
|
||||||
|
->references('id')->on('school_classes')
|
||||||
|
->onDelete('cascade');
|
||||||
|
$table->foreign('teacher_id')
|
||||||
|
->references('id')->on('teachers')
|
||||||
|
->onDelete('set null');
|
||||||
|
$table->foreign('subject_id')
|
||||||
|
->references('id')->on('subjects')
|
||||||
|
->onDelete('cascade');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::dropIfExists('timetables');
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -24,6 +24,8 @@ Route::post('classes/{class}/teacher', 'SchoolClassController@addClassroomTeache
|
|||||||
|
|
||||||
Route::apiResource('themes', 'ThemeController');
|
Route::apiResource('themes', 'ThemeController');
|
||||||
|
|
||||||
|
Route::apiResource('timetables', 'TimetableController');
|
||||||
|
|
||||||
Route::get('banktasks', 'BankTaskController@index'); //получение списка всех заданий
|
Route::get('banktasks', 'BankTaskController@index'); //получение списка всех заданий
|
||||||
Route::group(['prefix' => 'banktask'], function () {
|
Route::group(['prefix' => 'banktask'], function () {
|
||||||
Route::post('', 'BankTaskController@store'); //создание задания
|
Route::post('', 'BankTaskController@store'); //создание задания
|
||||||
|
|||||||
Reference in New Issue
Block a user