0

我对 laravel 框架非常陌生。我有一个表格,我需要在点击提交按钮时更新它。当提交按钮点击控制转到 controller.php 的 update() 函数。但我无法编辑任何字段的值。

这是我的代码。

    public function update($id)
    {
        //echo "<pre>";print_r(Input::all());exit;

        $product    = $this->product->find($id);

        $input      = Input::only('designer', 'sku', 'name', 'display_name', 'description', 'price', 'main_category', 'sub_category', 'lead_time', 'sizing', 'woven', 'body_fabric', 'lining_fabric', 'fit', 'primary_color', 'secondary_color', 'care_label', 'neck_type', 'closure', 'trims', 'special_finishings', 'image1', 'image2', 'image3', 'image4', 'image5','top', 'combo_products', 'keywords', 'visibility', 'featured');
        //echo "<pre>";print_r($input);exit;

        try
        {
            $this->adminNewProductForm->validate($input);


        } catch(\Laracasts\Validation\FormValidationException $e)
        {
            return Redirect::back()->withInput()->withErrors($e->getErrors());


        }

        $slug       = Str::slug(Input::get('name'));

        $slug       = $this->product->getSlug($slug);

        $input      = array_add($input, 'slug', $slug);


        DB::transaction(function() use($product, $input)
        {

            $product->fill($input)->save();

            $stock_count    = 0;

            if(!empty(Input::get('xsmall_size')))
            {
                $rows = DB::table('products_variants')->where('product_id', $product->id)->where('variant_name', 'XS')->get();

                $stock_count += Input::get('xsmall_stock');

                if(!empty($rows))
                {
                    DB::table('products_variants')->where('product_id', $product->id)->where('variant_name', 'XS')->update(array('variant_specs' => Input::get('xsmall_size'), 'price_change' => Input::get('xsmall_price'), 'total_stock' => Input::get('xsmall_stock'), 'stock_used' => 0));


                } else {

                    DB::table('products_variants')->insert(array('product_id' => $product->id, 'variant_name' => 'XS', 'variant_specs' => Input::get('xsmall_size'), 'price_change' => Input::get('xsmall_price'), 'total_stock' => Input::get('xsmall_stock'), 'stock_used' => 0));

                }

            }

$input = array();

            $input['flagship_status'] = Input::get('flagship_status');

            if(Input::get('flagship_status'))
            {

                $input['stock_count'] = Input::get('small_stock');

            }else {

                $input['stock_count'] = $stock_count;
            }

            $product->fill($input)->save();

        });

        //echo "<pre>";print_r(Input::all());exit;

        return Redirect::back()->withFlashMessage('Product Updated Successfully!');

    }

我也无法理解,这条线是怎么回事?因为我在代码中的任何地方都没有找到验证函数。

$this->adminNewProductForm->validate($input);

我需要更新表products而不是products_variants

4

1 回答 1

0

validate继承自FormRequst类。

https://laravel.com/api/5.0/Illuminate/Foundation/Http/FormRequest.html#method_validate

你提供了太多的代码和太少的信息。你说你需要更新一个特定的表,但是有两行你非常有意手动更新数据库条目。

这是其中之一:

DB::table('products_variants')->where('product_id', $product->id)->where('variant_name', 'XS')->update(array('variant_specs' => Input::get('xsmall_size'), 'price_change' => Input::get('xsmall_price'), 'total_stock' => Input::get('xsmall_stock'), 'stock_used' => 0));

当你调用这个时:

$product->fill($input)->save();

它还保存也属于它的“脏”(修改过的)模型,其中可以包括products_variants关系。从它的声音来看,您错误地直接通过 SQL 应用更改,然后模型的保存方法正在覆盖它。

您似乎不清楚您的代码实际上在做什么,我强烈建议您简化它并在您开始了解每一行的作用时添加代码。我认为您的问题是在不了解 Laravel 如何处理关系和模型的情况下复制示例并添加自己的工作的副产品。使用原始 SQL 或 DB 语句几乎没有充分的理由。

于 2016-04-30T06:57:50.167 回答