我有一个时间跟踪应用程序,每次要添加一个新的时间条目时,我必须首先验证之前的所有时间条目是否都已关闭(意味着已设置结束日期),并使用validate()方法抛出错误消息.

我不知道这有多可行,也不知道如何做到,阅读文档似乎大多数定制规则都要求提供属性,但在这种情况下,更多的是验证逻辑需求,而不是post请求的形式.

当我收到一个post请求时,我会获取所有在post请求开始时间之前的、尚未给出结束时间的时间条目.

理想情况下,如果我得到任何返回的时间条目,我会抛出一个错误,说"你需要在打开一个新的时间条目之前关闭上一个时间条目".

为了更清楚,我想在代码中做以下几点:

$timeEntry= new TimeEntry;
$openTimeEntries = $timeEntry->Where('start_time', '<', $request->startTime)->Where('end_time', 0)->get();
$count = $openTimeEntries->count();

$request->validate([
    'comment' => 'string',
    'candidateId' => 'required',
    'startTime' => 'required|date',
    'endTime' => 'date|nullable|after:startTime',
    'CustomeTimeEntryRule' => $openTimeEntries->count() > 0, // If false I want this rule to add the message to the validate error array
]);

推荐答案

一种简单的方法是将自定义属性合并到请求中:

$timeEntry= new TimeEntry;
$openTimeEntries = $timeEntry->Where('start_time', '<', $request->startTime)->Where('end_time', 0)->get();
$count = $openTimeEntries->count();

$request->merge([
        'CustomeTimeEntryRule' => $count,
    ]);

然后,我们可以使用in规则验证属性,当计数不等于0时,该规则将返回一条自定义验证消息,我们可以将其指定为第二个参数:

$request->validate([
    'comment' => 'string',
    'candidateId' => 'required',
    'startTime' => 'required|date',
    'endTime' => 'date|nullable|after:startTime',
    'CustomeTimeEntryRule' => 'in:0',
], [
    'CustomeTimeEntryRule.in' => 'You need to close the previous time entry before opening a new one' 
]);

Php相关问答推荐

如果活动订阅者的购物车中有订阅项目,则在WooCommerce签出中显示通知

PHP:从数组中获取唯一的数字组合

WooCommerce购物车中仅允许一个可下载产品

在没有谷歌云客户端PHP库的情况下将图像上传到PHP中的Google存储API?

通过DO LAMP进行身份验证并从邮箱发送邮箱的最简单方式是什么

PHP MySQL求和子树并与父树累加

免费送货柜台,考虑到折扣码

返回WooCommerce中的所有已启用变体

如何在UML类图中可视化变量引用数组

CKEDITOR-如何在PHP中判断提交后的空数据

即使在WooCommerce购物车中添加了两次产品,也要将所有项目设置为空白行

Laravel自定义验证规则更正

如果WooCommerce购物车在 checkout 时被清空,请重定向至store 页面

PHP按另一个二维数组的排序顺序对二维数组进行排序

在WooCommerce中以编程方式添加特定产品后,将价格设置为零

PHP访问子数组列表出错结果和长度

计算添加到购物车的点击次数并将其显示在 WooCommerce 管理产品列表中

来自 GoDaddy 的邮箱在 Gmail 中显示为via

列表不在 GROUP BY 子句中并且包含 X2CRM 中的非聚合列

PHP路由不重定向