Laravel 5无法正确更新

时间:2018-01-10 20:04:38

标签: php laravel-5

我正在使用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)时,该值是正确的。

1 个答案:

答案 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
>