【问题标题】:Adapt my code by adding start_time and stop_time in my booking通过在我的预订中添加 start_time 和 stop_time 来调整我的代码
【发布时间】:2020-02-15 18:53:48
【问题描述】:

我必须在我的TrainingController 中添加两个变量 => start_time & stop_time

在我的旧代码中,我有这个:

 $conflictTraining = Training::where('fk_motorbike', $request->get('fk_motorbike')) 
 ->whereDate('date_seance', "=" , Carbon::parse($date_seance)) 
 ->where('hour_start', "<=" , $request->get('hour_start')) 
 ->where('hour_end', ">=" , $request->get('hour_end'))
 ->where('fk_former', $request->get('fk_former'))
 ->first();

我的问题是我想做一个检查。如何避免重复我的请求 $conflictTrainingstart_time & stop_time..

这是我现在的代码:

public function store(Request $request)
    {
        $request->validate([
            'date_seance' => 'required',
            'hour_start' => 'required',
            'hour_end' => 'required',
            'fk_motorbike' => 'required',
            'fk_former' => 'required',
            'fk_student' => 'required',
            'fk_typeseance' => 'required'


        ]);


        $start_time = Carbon::createFromFormat('d-m-Y H:s', $date_seance . ' ' . $hour_start);
        $stop_time = Carbon::createFromFormat('d-m-Y H:s', $date_seance . ' ' . $hour_end);


        $conflictTraining = Training::where('fk_motorbike', $request->fk_motorbike)
            ->where('start_time', "<=", $start_time)
            ->where('stop_time', ">=", $stop_time)
            ->first();


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


        $data = $request->all();
        $data['start_time'] = $start_time;
        $data['stop_time'] = $stop_time;
        Training::create($data);
        return redirect()->route('trainings.index')
            ->with('success', 'Add');


    }

提前感谢您的帮助。

【问题讨论】:

  • 请澄清您的具体问题或添加其他详细信息以准确突出您的需要。正如目前所写的那样,很难准确地说出你在问什么。请参阅How to Ask 页面以获得澄清此问题的帮助。

标签: laravel laravel-5


【解决方案1】:

如果您询问如何为几个新数据库字段添加新约束,start_timestop_time,我认为您当前对 $conflictTraining 的查询非常接近。

您没有说明具体问题是什么,但我猜这些行:

$start_time = Carbon::createFromFormat('d-m-Y H:s', $date_seance . ' ' . $hour_start);
$stop_time = Carbon::createFromFormat('d-m-Y H:s', $date_seance . ' ' . $hour_end);

正在生成与数据库中start_timestop_time 的格式不匹配的内容。如果你分解你在这些变量中创建的内容,你基本上是在告诉 Carbon 创建一个看起来像这样的变量:“15-10-2019 10:00:00”(需要注意的是 00 是秒,而不是分钟,因为您使用 s 而不是 i)。

所以您的第一个问题应该是,“我的数据库是否以我转储 $start_time 时显示的确切格式存储开始时间?”如果没有,查询将永远不会产生命中。您当然可以将开始时间和停止时间以日期和时间的形式存储在数据库中......但请记住,如果这样做,您将受到日期和时间的限制。换句话说,如果您只想将开始时间设置为任何一天的 10:00,那将是行不通的,因为数据库存储的是特定日期的 10:00

解决此问题的一种方法是使其尽可能简单。如果这些时间没有链接到特定日期,并且总是在整点 - 将它们保存为一个简单的数字。例如。 0822。然后,您不需要使用 Carbon,您只是在比较简单的整数。如果您想使用实际时间(您可能需要 18:20 或其他时间),这并不复杂 - 您只需要更改存储和创建时间的方式。

您可以使用它,但一般的想法是在数据库和您从表单创建的内容之间以一致的格式存储/创建时间。所以对于start_time,您也许可以将小时和分钟保存在不同的列中。或者计算午夜后的分钟数并存储为整数。或者甚至存储为文本并在两侧使用 Carbon 来制作格式化对象。

就我个人而言,我发现使用整数最容易,所以我会进行计算(可能在午夜过后的几分钟内)并在整个程序中使用该计算来保持整数。有很多方法可以解决这个问题 - 希望这可以向您解释这个问题。

【讨论】:

  • 感谢您的解释。我的请求 $conflictTraining 我只能在每个日期添加一条记录,我觉得这太奇怪了。
  • 是的,这对您的代码是正确的。您的代码询问是否有任何培训在任何日期介于 x 小时和 x 小时之间。如果您想再记录一个,则需要在其中添加一行以检查同一查询中的date_seance 字段,以将查询范围缩小到当时只有一天。但是,好消息是您似乎已经解决了您的start_timestop_time 问题:)
  • 是的,非常感谢您的解释。我和你学到了很多。
猜你喜欢
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多