我现在的困境是:
我有一个提交的表单,该表单指示要从数据库表中删除哪些行。我们称之为表1。
但是,如果该行的id位于另一个表中(存在外键约束),则不应允许删除该行。我们称之为表2。
或者,换句话说,如果表2中没有引用行的id,则从表1中删除。
在PHP中,这对我来说很简单。老实说,我可以在控制器内部用PHP硬编码,但我想使用Laravel的验证错误,因为目前所有其他功能都使用上述错误处理。我要检查的php等价物如下:
foreach($result->id as $id){
if (DB::table('table2')->where('fk_column', $id)->count() == 0){
DB::table('table1')->where('id', $id)->delete();
}
}
我没有看到我的问题在任何地方得到了足够的解释代码是如何工作的。有没有一种方法可以创建一个验证规则来专门执行此操作并抛出错误?有没有办法运行PHP代码并抛出一个可以放入errors数组的错误?
最佳答案
最简单的解决方案是创建一个自定义验证器。
在Laravel 5.4中,您也可以通过使用带有自定义查询的exists
验证规则来获得相同的效果,正如在这里的最后一个示例中所解释的https://laravel.com/docs/5.4/validation#rule-exists
这个例子使用的是Rule::exists('staff')->where(function ($query) ...
,但是API文档列出了whereNot()方法也可用https://laravel.com/api/5.4/Illuminate/Validation/Rules/Exists.html#method_whereNot
所以,我想(请注意,我还没有测试过)你应该这样写:
Validator::make($data, [
'delete_id' => [
'required',
Rule::exists('table2')->whereNot(function ($query) use ($data) {
$query->where('fk_column', $data['delete_id']);
}),
// ...
],
]);
关于php - Laravel:使用“不在数据库中”表验证表单请求,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45175367/