laravel 中的验证器可以自定义存在的数据库规则,例如,如果您需要检查额外的列。手册中的一个例子:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::exists('staff')->where(function ($query) {
$query->where('account_id', 1);
}),
],
]);
闭包中的query
没有类型提示,所以我不太确定这是什么类型的对象。我可以看到它DatabaseRule
本身只有一些关于等的功能where
,wherenot
但我希望在组合中添加一个连接。
给定示例说电子邮件必须存在于具有 的员工account_id = 1
,但是如果团队(所有员工都是团队的一部分,这是一个单独的表)应该具有特定属性,例如team.active = 1
?
整个员工/团队的事情当然是一个例子
所以最后我想知道:我怎样才能在这条规则中添加一个连接,这样我们才能确保员工团队的“活动”列是 1。
我的第一个问题可能是:那是什么类型的$query
?我想这样的事情会很棒,但没有理由怀疑这是有效的:
Rule::exists('staff')->where(function ($query) {
$query
->join('team', 'team.team_id', '=', 'staff.team_id')
->where('team.active', 1);
})
这似乎不起作用。奇怪的是join本身并没有报错,反而好像被忽略了:
未找到列:
1054 'where 子句'中的未知列'team.active' (SQL:从where = -thevalue- 和 ( . = 1)中
选择 count(*) 作为聚合)staff
team
active
我原以为这会起作用(我赌这个函数在这里可用,所以会有小的变化),或者因为我正在调用一个不存在的函数而出现错误。但我得到的是一个构建但没有连接的查询。
从评论中,我向该$query->toSQL()
功能添加了一个。这确实显示了一个相当预期的结果,但它并没有计算出我得到的错误:
select * from `staff`
inner join `teams` on `teams`.`team_id` = `staff`.`team_id`
where `teams`.`active` = ?