我有什么
我有一个Room
模型,它与Reservation
有很多关系。CCD_ 3具有指示给定房间可用的属性CCD_。
目标
我希望能够在FormRequest
的rules
功能中验证,当我基于is_open
属性存储新预订时,房间是可用的。
我尝试了什么
已验证的数据在一个数组中,因此规则密钥需要为:data.room_id
。我知道exists
可以验证数据库中的某些内容,但我不知道它的语法是如何工作的。此外,我如何验证关系的属性?
class ReservationStoreRequest extends FormRequest {
public function authorize() {
return true;
}
public function rules() {
return [
'data.room_id' => 'exists:' // what goes here?
];
}
}
tl;dr
public function rules() {
return [
'data.room_id' => [
Rule::exists('rooms', 'id')->where(function ($query) {
$query->where('is_open', 1);
})
]
];
}
使用exists
进行验证
有关于exists
规则的文档,但它确实很简洁。让我们看看文档中的命令的实际含义。这个规则的要点是,它可以验证数据库中某个表中某个字段是否存在,该表由某些条件给定。例如,保存预订时,可以验证数据库中是否存在要预订的房间。
基本用法
'size' => 'exists:rooms'
如果size
列中有一个条目包含正在验证的值(在这种情况下是关键字size
的对应值,即large
(,则会检查rooms
表。这将导致以下SQL查询:
select count(*) as aggregate from `rooms` where `size` = "large";
指定自定义列名
在上一节中,已验证列的名称来自已验证属性的键("size"(。您可能需要指定不同的列名,因为您要验证的列的名称与数据的关键字不同(例如,"size"存储在"category"列中(。另一种情况是,rooms
表的主键只是id
,而不是验证数据中的room_id
。在您的情况下,验证数据的密钥是data.room_id
,但您希望检查rooms
的id
列。您可以指定用逗号分隔的列名:
'data.room_id' => 'exists:rooms,id'
如果id
列中有一个条目包含正在验证的值,则会检查rooms
表,从而生成以下SQL查询:
select count(*) as aggregate from `rooms` where `id` = 4;
使用额外子句指定自定义列名
如果需要进一步筛选结果,可以使用IlluminateValidationRule
类。传递表和列名(第二个是可选的,就像在基本用法部分中一样(,然后在匿名函数中向查询添加额外的子句。您可以使用请求中的每个输入数据,只需使用$this->input('propertyName')
或$this->all()
检索,然后手动处理即可:
'data.room_id' => [
Rule::exists('rooms', 'id')->where(function ($query) {
$query
->where('is_open', 1);
->where('size', $this->input('data.size'));
})
]
由此产生的SQL查询如下:
select count(*) as aggregate from `rooms` where `id` = 4 and (`is_open` = 1 and `size` = large);
$query
变量中的可用子句为where
、whereNot
、Room
0、whereNotNull
、whereIn
和whereNotIn
。查看Illuminate/Validation/Rules/Exists
类文档。