如何在Laravel中验证关系属性



我有什么

我有一个Room模型,它与Reservation有很多关系。CCD_ 3具有指示给定房间可用的属性CCD_。

目标

我希望能够在FormRequestrules功能中验证,当我基于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,但您希望检查roomsid列。您可以指定用逗号分隔的列名:

'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变量中的可用子句为wherewhereNotRoom0、whereNotNullwhereInwhereNotIn。查看Illuminate/Validation/Rules/Exists类文档。

相关内容

  • 没有找到相关文章