所以我有一个名为Customer的模型。 客户的数据库如下所示:
id,姓名,姓氏,个人,地址,邮编,位置,电话,电子邮件updated_at,created_at
电子邮件和电话是特殊行,因为它们存储为json对象示例
['john@doe.com','some@othermail.com','more @ mails.com']
我使用客户模型存储验证规则和自定义消息,如
<?php
class Customer extends BaseModel
{
public function validationRules()
{
return array(
'name' => 'required|max:255',
'lastName' =>'max:255',
'personal'=> 'integer',
'location' => 'max:255',
'address' => 'max:255',
'zip' => 'required|integer',
'phones' => 'betweenOrArray:8,10|required_without:emails',
'emails' => 'emailOrArray'
);
}
public function validationMessages()
{
// returns Validation Messages (its too much to write down)
}
}
OrArray规则可在此处找到https://stackoverflow.com/a/18163546/1430587
我通过我的控制器像这样打电话给他们
public function store()
{
$customer = new Customer;
$messages = $customer->validationMessages();
$rules = $customer->validationRules();
$input['name'] = Input::get('name');
$input['lastName'] = Input::get('lastName');
$input['personal'] = preg_replace("/[^0-9]/", "", Input::get('personal'));
$input['location'] = Input::get('location');
$input['address'] = Input::get('address');
$input['zip'] = Input::get('zip');
$input['emails'] = Input::get('emails');
$input['phones'] = Input::get('phones');
foreach($input['phones'] as $i => $value)
{
$input['phones'][$i] = preg_replace("/[^0-9]/", "", $value);
}
$validator = Validator::make($input, $rules, $messages);
}
这一切都很好,但我希望能够PUT / PATCH请求更新单行。 但是validationRules在某些字段上具有Required,所以当它不存在时我无法更新该行。没有得到错误,其他字段(我不发布)是必需的。
我最好如何做到这一点?
答案 0 :(得分:1)
您应该获取代表您要编辑的行的模型实例,这就是资源控制器的update方法具有您要编辑的资源的参数的原因。
public function update($resourceId) {
$customer = Customer::where('id', '=', $resourceId);
}
现在,此客户拥有您之前设置的所有属性,因此您可以访问它们,如:
$customer->name;
$customer->lastName;
因此,当您对值进行验证时,您可以使用验证器中输入为空的现有值:
$input['name'] = (Input::get('name')) ? (Input::get('name')) : $customer->name;
或者是elvis运营商提供的更漂亮的解决方案:
$input['name'] = (Input::get('name')) ?: $customer->name;
答案 1 :(得分:0)
我提出了另一个解决这个问题的方法,该问题非常有效且更清洁。
$customer = Customer::find($id);
$input = Input::except('_method', '_token');
$customer->fill($input);