Значение формы ввода общей суммы с помощью Laravel

#laravel

#Laravel

Вопрос:

Я хотел бы создать форму в Laravel (только) с 3 полями: title, price, quantity , имя страницы называется ‘create.blade.php «. введите описание изображения здесь

Моя первая проблема заключается в том, что когда я ввожу 3 значения, ничего не происходит! Страница create.blade.php застрял ! У меня нет сообщения об ошибке

введите описание изображения здесь

моя вторая проблема — получить общую сумму на моей странице ‘index.blade.php ‘

В моей таблице продуктов у меня есть это:

 public function up()
    {
        Schema::create('products', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('title');
            $table->integer('quantity');
            $table->double('price');
            $table->double('total')->nullable();
            $table->timestamps();
        });
    }
  

В моем ProductController у меня есть это:

 public function index()
    {
        $products = Product::oldest()->paginate(5);
        return view('admin.products.index', compact('products'))
                  ->with('i', (request()->input('page', 1)-1)*5);
    }


    public function create()
    {

        $products = Product::all();
        return view('admin.products.create', compact('products'));
    }


    public function store(Request $request)
    {
        $request->validate([
                'title' => 'required',
                'quantity' => 'required',
                'price' => 'required',
                'total' => 'required'
        ]);

        Product::create($request->all());

        return redirect()->route('products.index')
                    ->with('success', 'save');
    }
  

В моей модели продукта

  protected  $fillable = ['title', 'quantity', 'price', 'total']; 

    public function setTotalAttribute()
    {
        $this->attributes['total'] = $this->quantity * $this->price;
    }

    public function getTotalAttribute($value)
    {
        return $value;
    }
  

И в моем create.blade.php У меня есть это:

  <form class="panel-body" action="{{route('products.store')}}" method="POST" novalidate>
              @csrf
              <fieldset class="form-group {{ $errors->has('title') ? 'has-error' : '' }}">
                <label for="form-group-input-1">Title</label>
                <input type="text" name="title" id="title" class="form-control" value="{{ old('title')}}"/>
                {!! $errors->first('title', '<span class="help-block">:message</span>') !!}
              </fieldset>

              <fieldset class="form-group {{ $errors->has('quantity') ? 'has-error' : '' }}">
                <label for="form-group-input-1">Quantity</label>
                <input type="text" name="quantity" id="quantity" class="form-control" value="{{ old('quantity')}}"/>
                {!! $errors->first('quantity', '<span class="help-block">:message</span>') !!}
              </fieldset>

              <fieldset class="form-group {{ $errors->has('price') ? 'has-error' : '' }}">
                <label for="form-group-input-1">Price</label>
                <input type="text" name="price" id="price" class="form-control" value="{{ old('price')}}"/>
                {!! $errors->first('price', '<span class="help-block">:message</span>') !!}
              </fieldset>

              <a href="{{route('products.index')}}" class="btn btn-primary pull-right">Back</a>
              <button type="submit" class="btn btn-sm btn-primary">OK</button>

            </form>
  

Маршрут

 Route::resource('/products', 'ProductController');
  

Файл index.blade.php

 @foreach($products as $product)
                <tr>
                   <td> {{$product->title}}</td>
                   <td> {{$product->quantity}}</td>
                   <td> {{$product->price}}</td>
                   <td> {{$product->total}}</td>
                   <td>
                     <form method="POST" action="{{ route('products.destroy', $product) }} ">
                    <a class="btn btn-sm btn-warning" href="{{route('products.edit',$product->id)}}">Editer</a>
                    @csrf
                    @method('DELETE')
                    <button type="submit" class="btn btn-sm btn-danger">Deleter</button>
                    </form>
                    </td>
                </tr>
                @endforeach
  

Если я уже знаю, как решить мою первую проблему о create.blade.php , Я счастлив.

Большое спасибо за вашу помощь.

Редактировать: введите описание изображения здесь

Я не получаю общую сумму…

Комментарии:

1. Покажите нам свои маршруты, пожалуйста!

2. @Lucas Piazzi: Привет, Пиацци, ^^ Я отредактировал свое сообщение.

Ответ №1:

Первая проблема:

В вашем productController вы подтверждаете это 'total' => 'required' , но в вашем create.blade.php файле вы ничего не отправляете относительно total . В результате проверка возвращает ошибку, но вы даже не показываете ее. Итак, вы думаете, что форма застряла, хотя это не так. На самом деле требуется перенаправление обратно с ошибкой проверки total файла.

Вторая проблема

Я не уверен на 100% в этом решении, но вы можете попробовать приведенный ниже мутатор. Модель.

 public function setTotalAttribute()
{
    $this->attributes['total'] = $this->attributes['quantity'] * $this->attributes['price'];
}
  

Кстати, вам не нужен ненужный getTotalAttribute метод в вашем

Из комментариев

Похоже, вы боретесь с мутатором Eloquent. Итак, давайте удалим метод мутатора setTotalAttribute и средство доступа из модели и в контроллере

замените следующую строку:

Product::create($request->all());

следующими строками:

 $data = $request->all(); 
$data['total'] = $request->price * $request->quantity; 
Product::create($data);
  

Теперь проверьте, работает ли это.

Комментарии:

1. спасибо, моя первая проблема решена. Но теперь, как я могу получить общую сумму, пожалуйста? Моя модель продукта неверна???

2. Обновил ответ, попробуйте.

3. @Imrar: Спасибо, Имран, в моем index.blade.php Я поставил это <td> {{$product->setTotalAttribute->total}}</td> , но у меня есть сообщение об ошибке AppProduct::setTotalAttribute must return a relationship instance. , я действительно застрял …. 🙁

4. Похоже, вы боретесь с мутатором Eloquent. Итак, давайте удалим setTotalAttribute метод из модели. и в контроллере $data = $request->all(); $data['total'] = $request->price * $request->quantity; Product::create($data);

5. Обновлен ответ, содержащий предыдущий комментарий.