我正在使用Laravel 5.4和PHP 7.1 我在更新我的一个模型时遇到了问题。我使用相同的表单进行创建和更新,创建按预期工作但更新没有。奇怪的是我有另一个模型完全按照预期工作,但我发现我使用的代码之间没有任何区别。这是我的第一个Laravel项目,我是自学成才,所以我的代码中可能有些东西不是好习惯,我欢迎任何建设性的批评。
当我尝试将checkbox属性更新为false时,它总是返回true。当我创建初始对象时,我得到true和false复选框的正确值,但是如果布尔值为true,那么我不能将其设置为false。我不确定这是刀片还是我的代码中的问题。在控制器中,我在更新之前使用了dd($ item),即使取消选中该复选框,该值也为true。在模型中我有一个强制转换来确保属性是布尔值,模型中有一个mutator来确保值为0或1,并且在请求中有一个类似的特性来确保值为0或1.这两个属性我有问题的是has_accessories和has_services。
我在更新价格字段时遇到问题,如果价格中有逗号,我会在更新时收到错误。有趣的是,当我在更新之前执行dd($ item)时,值不中有逗号。在初始创建时,我可以在价格中包含逗号时保存对象。当我在html页面中省略逗号时,则没有问题。模型中有一个mutator,它删除请求中的任何逗号或$和类似代码。我遇到问题的属性是价格。
以下是该模型的相关代码:
class Item extends Model
{
protected $fillable = ['item_type_id', 'item_category_id', 'item_condition_id', 'name',
'description', 'serial_number', 'serial_accessory', 'size', 'price',
'has_accessories', 'has_services', 'manafacturer',
'manufacturer_serial_number', 'refrigerant_type'];
protected $guarded = ['id'];
protected $dates = ['created_at', 'updated_at'];
protected $casts = ['has_accessories' => 'boolean', 'has_services' => 'boolean'];
// mutators - also located in Requests\ItemRequest (custom form validation)
protected function setPriceAttribute($value)
{
if (isset($value)) {
$this->attributes['price'] = str_replace(',', '', $value);
$this->attributes['price'] = str_replace('$', '', $value);
} else {
$this->attributes['price'] = 0;
}
}
protected function setHasAccessoriesAttribute($value) { $this->attributes['has_accessories'] = isset($value) ? $value : FALSE; }
protected function setHasServicesAttribute($value) { $this->attributes['has_services'] = isset($value) ? $value : FALSE; }
// accessors
protected function getPriceAttribute($value) { return isset($value) ? number_format(round($value, 2), 2, '.', ',') : 0; }
以下是我的控制器的相关代码:
public function store(ItemRequest $itemRequest)
{
// dd($_POST);
Item::create($itemRequest->request->all());
session()->flash('alert', $itemRequest->request->get('name').' created.');
return redirect('items');
}
public function update(Request $itemRequest, Item $item)
{
//dd($item);
$item->update($itemRequest->request->all());
session()->flash('alert', $item->name.' updated.');
return back();
}
以下是请求:
class ItemRequest extends FormRequest
{
public function authorize()
{
// only allow if user is logged in
return Auth::check();
}
public function rules()
{
return [
'item_type_id' => 'required|integer|exists:item_types,id',
'item_category_id' => 'required|integer|exists:item_categories,id',
'item_condition_id' => 'required|integer|exists:item_conditions,id',
'name' => 'required|between:1,50|string',
'description' => 'required|string',
'serial_number' => 'nullable|max:25|alpha_dash',
'serial_accessory' => 'nullable|max:10|alpha_dash',
'size' => 'nullable|alpha_num',
'price' => 'nullable|numeric',
'has_accessories' => 'required|boolean',
'has_services' => 'required|boolean',
'manufacturer' => 'nullable|string|max:30',
'manufacturer_serial_number' => 'nullable|string|max:30',
'refrigerant_type' => 'nullable|string|max:30'
];
}
protected function prepareForValidation()
{
$this->sanitizeInput();
return parent::getValidatorInstance();
}
private function sanitizeInput()
{
// get the input
$input = array_map('trim', $this->all());
$input['has_accessories'] = isset($input['has_accessories']) ? $input['has_accessories'] : FALSE;
$input['has_services'] = isset($input['has_services']) ? $input['has_services'] : FALSE;
$input['price'] = empty($input['price']) ? null : str_replace(',', '', $input['price']);
$this->replace($input);
}
}
以下是相关的刀片代码:
<div class='col-xs-2 col-sm-2 col-md-1 form-group margin_under_border'>
<label for='price' class='form-label'>Price</label>
</div>
<div class='col-xs-4 col-sm-4 col-md-2 form-group margin_under_border'>
<input type='text' id='price' name='price' value="{{ old('price', isset($item) ? $item->price : null) }}" class='form-control'>
</div>
<div class='col-xs-4 col-sm-4 col-md-2 form-group margin_under_border'>
<label for='has_accessories' class='form-label'>Has Accessories</label>
</div>
<div class='col-xs-1 col-sm-1 col-md-1 form-group margin_under_border'>
<input type='checkbox' id='has_accessories' name='has_accessories' class='form-control' value=1 {{ (old('has_accessories', isset($item) ? $item->has_accessories : 1) == 1)? 'checked' : '' }}>
</div>
<div class='col-xs-1 col-sm-1 hidden-md hidden-lg'>
</div>
<div class='col-xs-4 col-sm-4 col-md-2 form-group margin_under_border'>
<label for='has_services' class='form-label'>Has Services</label>
</div>
<div class='col-xs-1 col-sm-1 col-md-1 form-group margin_under_border'>
<input type='checkbox' id='has_services' name='has_services' class='form-control' value=1 {{ (old('has_services', isset($item) ? $item->has_services : 1) == 1) ? 'checked' : '' }} >
</div>
我感谢任何帮助。陷入如此简单的行动是如此令人沮丧。
更新:当我使用修补程序时,我可以成功地将模型中的布尔属性设置为false。当它有逗号时我无法设置price属性。
我已经注释了我的模型和请求中的所有代码,我将更新更改为$ item-&gt; update()而不是通过请求运行它,我将复选框代码更改回原始:
<div class='col-xs-1 col-sm-1 col-md-1 form-group margin_under_border'>
@if (old('has_accessories', isset($item) ? $item->has_accessories : 1) == 1)
<input type='checkbox' id='has_accessories' name='has_accessories' class='form-control' value=1 checked>
@else
<input type='checkbox' id='has_accessories' name='has_accessories' class='form-control' value=1>
@endif
</div>
我仍然遇到同样的问题。我认为这可能是导致它的代码中的错误,但它不能比更新语句简单。我无法解决的问题是,如果它是复选框代码,那么为什么它在创建时按预期工作,而不是在更新时?
当我执行dd($ item)时,未选中复选框的值不正确(如果以前是真的)但是当我执行dd($ _ POST)时,该值是正确的。
答案 0 :(得分:0)
您可以在.blade
中尝试另一个版本:
<input type='checkbox' id='has_services' name='has_services' class='form-control' value=1
@if(isset($item))
@if($item->has_services == 1)
checked
@endif
@endif
>