#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. Обновлен ответ, содержащий предыдущий комментарий.