Мой проект - создать небольшую автошколу для мотоцикла.

У меня есть 4 таблицы: Former, Training, Revision, Motorbike

enter image description here

Мои функции create () и store () работают с моими 4 формами.

Однако у меня есть большая проблема ... Если мой мотоцикл находится в revision на 03/09/2019 - 05/09/2019 мотоцикле 000001

И что я закодирую в своей форме training бронирование 03/09/2019 с номером мотоцикла 000001; Обычно мотоцикл недоступен, как я могу справиться с этим?

enter image description here enter image description here

Можно ли создать дублирующую систему для форм revision -> training или обратную training -> revision

В моей версии контроллера у меня есть это:

public function index()
    {
        $revisions = Revision::oldest()->paginate(5);
        return view('admin.revisions.index', compact('revisions'))
          ->with('i', (request()->input('page',1) -1)*5);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()            
    {

        $motorbikes = Motorbike::all();
        return view('admin.revisions.create', compact('motorbikes','revisions'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {

        $date_revision_start = $request->get('date_revision_start');
        $date_revision_end = $request->get('date_revision_end');
        $hour_start = $request->get('hour_start');
        $hour_end = $request->get('hour_end');
        $garage = $request->get('garage');
        $fk_motorbike = $request->get('fk_motorbike');

        $conflict = Revision::where('fk_motorbike', $request->get('fk_motorbike'))->whereDate('date_revision_start', "<=" , $date_revision_start)
            ->whereDate('date_revision_end', ">=", $date_revision_start)
            ->first();

        $conflict2 = Revision::where('fk_motorbike', $request->get('fk_motorbike'))->whereDate('date_revision_start', "<=" , $date_revision_end)->whereDate('date_revision_end', ">=", $date_revision_end)->first();



        if(isset($conflict2) || isset($conflict)){
            return redirect()->route('revisions.index')
             ->with('error', 'duplicate');
        }

       else{
        Revision::create($request->all());
            return redirect()->route('revisions.index')
                ->with('success', 'new data created successfully');
        }

    }

И для обучения контролеров

public function index()
    {
        $trainings = Training::oldest()->paginate(5);
        return view('admin.trainings.index', compact('trainings'));
                with('i', (request()->input('page', 1) -1) *5);
    }



    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {   
        $motorbikes = Motorbike::all();
        $formers = Former::all();
        return view('admin.trainings.create', compact('motorbikes','formers','trainings'));
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $request->validate([
                'date_seance' => 'required',
                'hour_start' => 'required',
                'hour_end' => 'required',
                'fk_motorbike' => 'required',
                'fk_former' => 'required'


        ]);


       $exists = Training::where('date_seance', $request->get('date_seance'))->where('hour_start', $request->get('hour_start'))->where('hour_end', $request->get('hour_end'))->where('fk_motorbike', $request->get('fk_motorbike'))->count();

       if (!$exists){
            Training::create($request->all());
            return redirect()->route('trainings.index')
                ->with('success', 'Add');
        }

        else{
            return redirect()->route('trainings.index')
                ->with('error', 'Duplicate ');

        } 


    }

Не могли бы вы помочь мне, пожалуйста, потому что я все еще новичок в Laravel и я хочу решить эту проблему.

Заранее спасибо

Изменить

 $date_start = $request->get('date_seance'); 
       $fk_motorbike = $request->get('fk_motorbike');

       $hour_start = $request->get('hour_start');
       $hour_end = $request->get('hour_end');

        $conflictRevision = Revision::where('fk_motorbike', $fk_motorbike)
            ->whereDate('date_revision_start', "<=" , $date_start)
            ->whereDate('date_revision_end', ">=", $date_start)
            ->where('hour_start', "<=" , $hour_start)
            ->where('hour_end', "<=" , $hour_end)
            ->first();

        $conflictTraining = Training::where('fk_motorbike', $fk_motorbike)
            ->whereDate('date_seance', "=" , $date_start)
            ->where('hour_start', "<=" , $hour_start)
            ->where('hour_end', "<=" , $hour_end)
            ->first();

        if(isset($conflictTraining) || isset($conflictRevision)){
            return redirect()->route('trainings.index')
                 ->with('error', 'Duplicate ');
        }

        else{
            Training::create($request->all());
                return redirect()->route('trainings.index')
                    ->with('success', 'Add');
    }
0
user11124425 4 Сен 2019 в 02:10

2 ответа

Лучший ответ

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

Я собираюсь объяснить подробно и повторить себя в коде, но, надеюсь, это будет легче понять. Вы можете сжать этот код, как только он станет вам понятен. Не в последнюю очередь было бы сделать дубликат кода для ревизии отдельным методом в вашей ревизии контроллера , чтобы как ревизия контроллера , так и обучение контролера Можно из этого извлечь. Но это позже - сейчас давайте работать.

В своей тренировке для контролеров удалите $exists сейчас. Во-первых, нам нужно убедиться, что ревизия отсутствует, в то время как пользователь хочет применить обучение для мотоцикла. В этом случае, однако, в вашей модели есть только одна дата обучения, поэтому только одна $conflict проверка на ревизию:

$date_start = $request->get('date_seance'); // I assume your form field for training is date_seance
$fk_motorbike = $request->get('fk_motorbike');

// NOTE: the $date_start MAY need to be converted to a Carbon instance if it doesn't work - same as before

$conflictRevision = Revision::where('fk_motorbike', $fk_motorbike)
        ->whereDate('date_revision_start', "<=" , $date_start)
        ->whereDate('date_revision_end', ">=", $date_start)
        ->first();

Теперь нам нужно проверить, есть ли конфликт для обучения . Мы можем использовать те же переменные PHP, которые уже назначены, просто изменим модель, которую мы запрашиваем. Я предполагаю, что сеанс составляет ОДИН день для вашей модели:

$conflictTraining = Training::where('fk_motorbike', $fk_motorbike)
        ->whereDate('date_seance', "=" , $date_start)
        ->first();

И тогда это очень похоже на ту, которую мы использовали при проверке ревизий:

if(isset($conflictTraining) || isset($conflictRevision)){
     return redirect()->route('trainings.index')
            ->with('error', 'Duplicate ');
else{
     Training::create($request->all());
        return redirect()->route('trainings.index')
            ->with('success', 'Add');
}
1
Watercayman 4 Сен 2019 в 15:47

Самый простой способ - использовать область запроса в модели обучения. Я предполагаю, что мотоцикл целый день недоступен на доработке.

public function scopeAvailable($query) 
{
    return $query->whereNotBetween('trainings.date_sceance', [
        'revisions.date_revision_start' => function($q) {
             return $q->where('trainings.fk_motorbike', '=', 'revisions.fk_motorbike');
        },
        'revisions.date_revision_end' => function($q) {
             return $q->where('trainings.fk_motorbike', '=', 'revisions.fk_motorbike');
        }]
    );
}

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

$exists = Training::where('date_seance', $request->get('date_seance'))->available()->count();
1
Dimitri Mostrey 4 Сен 2019 в 06:07