我在Laravel的帮助下制作了一个简单的预订系统 . 预订的时间是租来汽车的想象中的汽车公司 . 所以你通过预订时间租车 . 我离项目很远,我差不多完成了 . 我只是有一个小问题 . 我不知道如何让我预订的时间“不可预订”这么说 .
我想要的独特之处是预订日期 . 在我的“预订”时间的迁移中(该表称为“时间”)我已经将列“日期”设置为唯一:
public function up()
{
Schema::create('times', function (Blueprint $table) {
$table->integer('car_id')->unsigned();
$table->date('date');
$table->timestamps();
$table->primary(array('car_id', 'date'));
});
}
日期“整数”使它成为唯一的,我不能预订两次 . 但我想做的是检查预订的时间是否在现在的十天的碳时间范围内 . 这些时间是这样的:
$dt = Carbon::now('Europe/Stockholm');
for ($i = 0; $i < 10; $i++) {
$dates[$i] = $dt->addDays(1)->toDateString();
}
然后我将$ dates变量发送到我的视图并显示如下:
<ul class="list-group">
@foreach ($dates as $date)
<form method="POST" action="/{{ $car->id }}/time">
{{ csrf_field() }}
<li class="list-group-item">
<input type="hidden" name="date" value="{{ $date }}">
{{ $date }}
<input type="submit" value="Boka" class="btn btn-primary"/>
</li>
</form>
@endforeach
</ul>
那么如果我按下“Boka”按钮,时间会被放入“时间”表中,因为我使用了关系,我用$ car-> time来达到它,就像我可以获得该特定汽车的所有预订时间一样 .
我在我的视图中显示了这样预订的所有时间:
<ul class="list-group">
@foreach ($car->time as $time)
<li class="list-group-item">
{{ $time->date }}
<form method="POST" action="/delete/time/{{ $time->car_id }}/{{ $time->date }}">
{{ method_field('DELETE') }}
{{ csrf_field() }}
<input type="submit" value="Delete" class="btn btn-danger"/>
</form>
</li>
@endforeach
</ul>
基本上我现在要做的就是检查Carbon的日期是否在“时间”表中我想要从视图中删除“Boka”按钮 .
我的老师告诉我以某种方式使用这段代码:
$this->validate($request, [
'date' => 'exists:times,date'
]);
我知道这段代码的作用,如果表格中的日期存在于列日期的时间表中,它会检查发送的请求 . 但我只是不知道在哪里使用它 . 我试过在我的“TimesController”中,我将日期添加到“时间”表中,如下所示:
public function update(Request $request, Car $car, Time $time) {
$this->validate($request, [
'date' => 'exists:times,date'
]);
$times = new Time;
$times->date = $request->date;
$car->time()->save($times);
return back();
}
但这并不像我想要的那样有效 . 它检查日期是否在表中,如果是 . 它广告它 . 但问题是,日期必须是唯一的,因此我收到一条错误消息,指出日期不是唯一的 . 这很好,但不是我想要的 . 所以,如果我添加一个尚未预订的日期 . 它没有像它应该添加日期 . 我通过在我的视图中编写此代码来检查我得到的错误:
<ul>
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
它输出的错误说:“所选日期无效 . ”所以我得到的是我的验证代码检查请求是否在数据库中,如果是,则添加日期 . 但是如果日期不在“时间”表中,则不会添加 . 这与我想要的完全相反 .
我尝试将它放在我的CarsController中,我在前面展示的Carbon的帮助下编制了日期 . 但我无法从中得到任何东西..
我知道这篇文章有点长 . 但我想尽可能多地获取信息 . 我真的很感激一些帮助 .
TL / DR:我想要做的是使用Laravel中的Validate功能来检查我的预订日期是否在预订的"times"表中 . IF 然后我想 "Boka" 按钮确实消失了 . 日期不应该添加到"times"表中 . 或者,"date"可能完全从使用Carbon制作的日期消失,如果它在"times"表中...
我真的不知道该怎么做所以我会感谢som的帮助 . 谢谢 . 是的,英语不是我的母语,所以请不要打击我 .
2 回答
只需在验证方法之后检查,如果它返回true或false并且基于该使用返回错误或继续进行 .
有许多方法可以在Laravel中验证您的数据 . 我会告诉你一些,随意选择你喜欢的那个 .
首先,基础知识 .
您可以在您选择的控制器方法中使用validate method . 官方文档有一个很好的例子 .
您的验证规则包含在方法的第二个参数中,该数组包含其他规则 .
但是,这不是处理验证的唯一方法 .
作为documentation says in the "Other Validation Approaches"部分,您可以:
用
Validator::make()
手动创建验证器;使
FormRequest
将您的验证规则(以及最终的逻辑)隔离在一个单独的类中;希望能帮助到你 . :)