我正在制作一个多步骤的注册表单。在第一步中,我需要收集first_name
,last_name
和dob
,然后创建仅包含这三个字段的Customer
对象 :
// RegistrationController.php
public function store_profile(Request $request) {
$rules = ['first_name' => '...', 'last_name' => '...', 'dob' => '...'];
$this->validate($request, $rules);
Customer::create($request);
}
问题是其他字段,例如address
,city
,state
等也可填写:
// Customer.php
protected $fillable = ['first_name', 'last_name', 'dob', 'address', 'city', 'state', ...];
我打算在注册的第二步(public function store_address()
)中收集它们,但没有任何内容可以阻止用户POST
将这些附加字段添加到第一步:
// RegistrationController.php
public function store_profile(Request $request) {
$rules = ['first_name' => '...', 'last_name' => '...', 'dob' => '...'];
$this->validate($request, $rules); // won't validate 'address', 'city', 'state'
Customer::create($request); // will store everything that's fillable,
// no matter if it was validated or not...
}
因此,我的目标是通过验证$request->all()
变量中定义的数组键过滤$rules
个字段。这是我的尝试:
$data = [];
foreach(array_keys($rules) as $key) {
$val = $request->{$key};
if (! empty($val))
$data[$key] = $val;
}
// in the end, $data will only contain the keys from $rules
// i.e. 'first_name', 'last_name', 'dob'
首先,是否有更有效/简洁的方法使用array_column
或array_intersect_key
或其他方式,可能没有手动循环?第二,是否有更多类似Laravel的方法,我不知道?
答案 0 :(得分:7)
noncentral_chisquare
(和only()
)怎么样?
except()
或
Customer::create($request->only(['first_name', 'last_name', 'dob']));
编辑:在Laravel 5.5中,有another solution:
Customer::create($request->only(array_keys($rules)));
答案 1 :(得分:0)
如果我是你,我会这样做的:
public function store_profile(Request $request) {
$rules = ['first_name' => '...', 'last_name' => '...', 'dob' => '...'];
$this->validate($request, $rules); // won't validate 'address', 'city', 'state'
Customer::create([
'first_name' => $request->input('first_name');
'last_name' => $request->input('last_name');
'dob' => $request->input('dob');
]);
}
甚至更简单:
Customer::create($request->only(['first_name', 'last_name', 'dob']));