Nan*_*nne 6 join laravel illuminate-container laravel-5 laravel-validation
laravel 中的验证器可以自定义现有数据库规则,例如,如果您需要检查额外的列。手册中的一个例子:
use Illuminate\Validation\Rule;
Validator::make($data, [
'email' => [
'required',
Rule::exists('staff')->where(function ($query) {
$query->where('account_id', 1);
}),
],
]);
Run Code Online (Sandbox Code Playgroud)
的query
在封闭不typehinted,所以我不是很积极,这是什么样的对象。我可以看到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);
})
Run Code Online (Sandbox Code Playgroud)
这似乎不起作用。奇怪的是join本身并没有报错,而是好像被忽略了:
未找到列:
1054 “where 子句”中的未知列“team.active”
(SQL:从staff
whereteam
.active
= 1) 中选择 count(*) 作为聚合)
我本来希望这会起作用(因为我打赌此函数在此处可用,因此发生了一些小变化),或者因为我调用了一个不存在的函数而出现错误。但是我得到的是一个构建但没有连接的查询。
从评论中,我向该$query->toSQL()
函数添加了一个。这确实显示了一个相当预期的结果,但它没有计算我得到的错误:
select * from `staff`
inner join `teams` on `teams`.`team_id` = `staff`.`team_id`
where `teams`.`active` = ?
Run Code Online (Sandbox Code Playgroud)
Nan*_*nne 10
似乎DatabaseRule
你在那个闭包中提供的任何东西都有一些魔法。最后,它似乎只查看提供的where
子句(请参阅 参考资料Exists::__toString
)。连接已保存为闭包内的回声显示,但存在规则仅查看 where。这就是未知列错误的原因。
我确实尝试了该using
函数,它似乎比where
我首先使用的更适合,但这无济于事,因为系统将其转换为一个字符串,该字符串形成了一个似乎不支持连接的验证字符串。
长话短说,我刚刚创建了一个自定义验证规则,passes
函数看起来像这样:
public function passes($attribute, $value)
{
$count = DB::table('staff')
->join('teams', 'teams.team_id', '=', 'staff.team_id')
->where([
['teams.active', '=', 1],
['staff.email', '=', $value]
])->count();
return $count > 0;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3409 次 |
最近记录: |