首页 > 解决方案 > “前任”的形式和可用性

问题描述

我被困在一个我以前没有想到的问题上。

我有一个formers包含 3 个字段的表单(name, firstname, status)

在此处输入图像描述

然后,我的第二种形式是trainingswith 2 fields (date_sitting, fk_former)

在这里,我有 1 个开会日期 ->16/07/2019前者是Dujardin Luc.

在此处输入图像描述

现在我的问题是,如果我想在 2019 年 7 月 18 日创建一个新的坐席。如何让前者Dujardin Luc在 2019 年 7 月 18 日或其他日期在我的下拉列表中可用?

在此处输入图像描述

就我而言,是否必须创建 2 个文件 create.blade ?第一个只有一个字段 ->date_sitting 而第二个表单将有一个字段 -> fk_former

这是我的 TrainingController 以获取信息

public function index()
    {
        $trainings = Training::oldest()->paginate(5);

        $formersNoTrainingToday = Training::whereDate('date_sitting', "!=", Carbon::today())
           ->orWhere('date_sitting', null)->get();

        $formers = Former::doesntHave('trainings')->get();

        return view('admin.trainings.index', compact('trainings'))
             ->with('i', (request()->input('page',1) -1)*5);

    }

标签: laravellaravel-5

解决方案


我不能给你完整的答案,因为有太多的事情要更新,还有一些事情要决定。

首先,您需要更改index()方法以发送更多不同的数据。如果前任可以训练多天,$formers = Former::doesntHave('trainings')->get();则不再有效 - 您现在需要所有前任,以便您可以添加新日期。所以就在$formers = Former::get();现在。

接下来,你$formersNoTrainingToday现在已经过时了,因为你不想识别那些今天不可用的人你想要一个所有培训日期的列表,以便与用户在表单中查找的任何日期进行比较。示例:如果Dujardin Luc想在 20XX 年 7 月 18 日训练,我们不希望他出现在 NoTraining 列表中,因为我们希望他有空,即使他今天没有空。

最后在控制器端,根据您希望如何在刀片端进行操作,您可能希望包含一个 AJAX 日期变量,用于通过用户通过 AJAX 请求的特定日期可用的那些前者发送。例如,如果您通过 AJAX,您可能有一种方法可以在您的控制器中像这样请求的日期发送那些可用的(不是确切的代码):

public function getFormersWithoutTrainingOnDateRequested($dateRequested){
    $formersAvailableToday = Training::whereDate('date_sitting', "!=", Carbon::createFromFormat('Y-m-d', $dateRequested))
             ->orWhere('date_sitting', null)->get();
    return json_encode($formersAvailableToday);
}

下一部分是在刀片侧。您在这里有很多选择,但我推荐的两种选择都涉及某种类型的 JS 或 Jquery。为了在用户请求的当天填充前辈列表,以获得最佳用户体验,您应该快速获取他们的列表。

date_sitting, fk_former最快的方法是从索引中向页面提供培训列表 ( )。这将作为数据对象存储在刀片页面的某些元素上。然后,当用户单击更改日期时,JS 或 Jquery 函数会将列表拉入 var,将其与另一个以相同方式存储的前者 id 列表进行比较,并立即重写选择列表,仅使用那些前者其 ID 与该日期不匹配。

第二种方法会慢一些,但更容易一些。这将涉及返回服务器以获取可用的模型列表。因此,您将在同一个选择上拥有一个 AJAX 功能,该功能可以返回到服务器以在所选日期提取那些可用的模型。AJAX pull的success()方法将提供重新编写选择框的信息,甚至可能重新制作整个表单。

抱歉,我无法编写所有代码,您必须在可以填写的空白处填写,但希望这足以帮助您弄清楚该去哪里。


推荐阅读