以某种方式,我觉得这应该是一个常见的问题,但是我似乎找不到一个明确的答案。
问题很简单: 在验证表单时,我想从结果数组中排除空的非必填字段-以便使用在数据库级别设置的默认值。
由于Laravel默认情况下使用的是ConvertEmptyStringsToNull中间件(并且我不太愿意更改它),因此这意味着我的空字段将被转换为'null'并发送到我的数据库(因此无法获取其默认值,并实际上中断了查询,因为这些字段在数据库级别不可为空。
$userData = $request->validate([
'email' => 'required|string|email|max:255|unique:users',
'number_of_whatever' => //if this field is empty, I want it stripped out the $userData array - or automatically default to the database default
]);
任何有关如何以最简洁的方式解决此问题的帮助将不胜感激!我正在考虑制定一个自定义规则,该规则将排除字段本身(这样我就可以在整个项目中重用此验证规则,而不必每次遇到这种情况时都必须手动执行)。 另一种选择是将其设置为“模型”级别-但并不热衷于此,当它已经在数据库级别完成时,似乎不得不在那儿这样做很奇怪。
谢谢!
答案 0 :(得分:0)
我认为您可以使用可为空的规则
split(col, '[-/& ]')
答案 1 :(得分:0)
嘿,我已经找到您的问题了,并且为此也做了一些工作。根据以下示例,我已经复制并且现在可以正确理解您的问题,即使验证器允许使用null值,create方法也会引发错误并且不设置默认值。
控制器
$validator = Validator::make($data, [
'name' => 'max:255',
'email' => 'max:255',
'password' => 'max:255',
]);
if ($validator->fails()) {
dd('Validator has failed');
}
// This throws an error saying that the fields cannot be null!
User::create($data);
用户表
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->default('Ken');
$table->string('email')->default('ken@stackoverflow.com');
$table->string('password')->default(bcrypt('password'));
$table->rememberToken();
$table->timestamps();
});
我所设计的解决方法是,像这样,在发布请求到达验证程序之前,将所有空值删除。
示例
$data = ['name' => null, 'email' => null, 'password' => null];
foreach($data as $key => $value)
{
if($value == null)
{
unset($data[$key]);
}
}
这里的逻辑是通过从发布请求中删除为null的字段,USER对象看不到它们具有值,因此允许将表的默认值放到表中,但是如果该值为null则仍然视为一个值,因此默认值将被忽略。
我希望这是有道理的。
答案 2 :(得分:0)
创建一个FormRequest并使用prepareForValidation
方法过滤出空值:
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class TestRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return
[
'username' => 'required|string|email|max:255|unique:users',
'number_of_whatever' => 'sometimes|integer',
];
}
protected function prepareForValidation()
{
if($this->number_of_whatever == null) {
$this->request->remove('number_of_whatever');
}
}
}
您可以在“有时”规则之后应用除“必需”以外的任何验证,并且仅在值不为null时应用。