【问题标题】:Duplicate system on two forms两种形式的重复系统
【发布时间】:2025-12-26 23:15:11
【问题描述】:

我的项目是创建一所小型摩托车驾驶学校。

我有 4 张桌子:Former, Training, Revision, Motorbike

我的函数 create() 和 store() 适用于我的 4 个表单。

但是,我有一个大问题......如果,我的摩托车在revision on03/09/2019 to 05/09/2019 for the motorbike000001

并且我在training 的表单中编码03/09/2019 上的预订,并使用摩托车号码000001;平时摩托车不可用,怎么办?

是否可以为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');
    }

【问题讨论】:

  • 我不太明白,您能详细说明一下您的问题吗?
  • 如果我理解正确,您想在提交培训预订表格时验证所选摩托车是否可用(即未修订) - 对吗?
  • @James:是的,没错……我被困了好几天……:-(
  • @Jesus Erwin Suarez:当我的摩托车(编号)000001 在 2019 年 8 月 9 日修改为 09/09/2019 时,我必须在 08/09 组织一次降神会/ 2019`总是和摩托车一起000001,我必须有一个检查系统来检查摩托车是否可用......这里,例如,自行车必须不可用。

标签: laravel laravel-5


【解决方案1】:

这是可能的,而且您几乎已经得到了您需要的东西。您可以在重复的修订代码之后对培训重复代码建模,并添加一个非常相似的修订重复代码以获得您的答案。

我将详细解释并以代码方式重复我自己,但希望这会更容易理解。一旦对您有意义,您就可以压缩此代码。其中最重要的是将修订的重复代码作为 Controller Revision 中的单独方法,以便 Controller RevisionController Training > 可以从中汲取灵感。但那是以后的事了——现在让我们开始吧。

在您的 Controller Training 中,暂时删除 $exists 内容。首先,我们需要确保在用户想要为摩托车应用 training 的同时没有 revision。但是,在这种情况下,您的模型中只有一个训练日期,因此只有一个 $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-check:

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');
}

【讨论】:

  • 非常感谢 Watercayman,我不知道该怎么感谢你......它有效,我无限感激你。
【解决方案2】:

最简单的方法是在训练模型中使用query scope。我会假设在修订时摩托车一整天都不可用。

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();

【讨论】: