Laravel 5.2 验证帮助存在于数据库中

Posted

技术标签:

【中文标题】Laravel 5.2 验证帮助存在于数据库中【英文标题】:Laravel 5.2 Validation Help Exist in Database 【发布时间】:2016-09-24 16:17:38 【问题描述】:

我正在 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'));
    );

日期“整数”使它独一无二,我不能预订两次。但我想做的是检查预订的时间是否在从今天起十天的 Carbon 时间范围内。那些时间是这样的:

$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”按钮,时间就会放在“times”表中,因为我使用关系,所以我使用 $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' 
]);

我知道这段 sn-p 代码的作用,它会检查表单中的日期是否存在于时间表中日期列上的请求中。但我只是不知道在哪里使用它。我已经尝试在我的“TimesController”中将日期添加到“times”表中,如下所示:

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 中的验证功能来检查我的预订日期是否在预订的“时间”表中。 IF 那么我希望 “Boka” 按钮消失。日期不应添加到“时间”表中。或者,如果“日期”在“时间”表中,则“日期”可能会完全从使用 Carbon 制作的日期中消失......

我真的不知道该怎么做,所以我会很感激 som 帮助。谢谢。 是的,英语不是我的母语,所以请不要抨击我。

【问题讨论】:

您是否尝试过创建专用的FormRequest?检查我的答案,在底部:) 另外,您是否正在验证日期格式是否有效? 【参考方案1】:

有很多方法可以在 Laravel 中验证您的数据。我将向您展示其中的一些,您可以随意选择您喜欢的。

首先是基础知识。

您可以在您选择的控制器方法中使用validate method。官方文档有一个很好的例子。

...

public function store(Request $request)

    $this->validate($request, [
        'title' => 'required|unique:posts|max:255',
        'body' => 'required',
    ]);

...

您的验证规则位于方法的第二个参数中,即带有其他规则的数组。

但是,这不是您处理验证的唯一方法。

作为documentation says in the "Other Validation Approaches" 部分,您可以:

使用Validator::make()手动创建验证器; 创建一个FormRequest 以将您的验证规则(以及最终的逻辑)隔离在一个单独的类中;

希望对您有所帮助。 :)

【讨论】:

我查看了文档。而且我认为关于“存在”东西的代码有点糟糕。我真的不知道该怎么做......就像我显然可以检查日期是否在“时间”表中,但现在我希望它工作...... @Addeuz 你也验证过日期格式没问题吗? @Franscesco 你是什么意思?我将日期格式设置为 yyyy-mm-dd 完全没有变化?【参考方案2】:

只需在 validate 方法之后检查它是否返回 true 或 false 并基于该使用返回错误或继续。

【讨论】:

以上是关于Laravel 5.2 验证帮助存在于数据库中的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 - 会话不会在路由更改中持续存在

在 laravel 5.2 中使用默认身份验证路由对用户进行身份验证后设置会话数据

在laravel 5.2中以编辑形式进行图像验证

Laravel 5.2 中的批量插入

在注册之前从数据库表中验证用户名 - LARAVEL

Summernote(数据未保存在数据库中)(laravel 5.2)