我想在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的第一个问题,那我很高兴。
非常感谢您的帮助。
我没有得到总金额...
答案 0 :(得分:2)
第一个问题:
在您的productController
中,您正在验证该'total' => 'required'
,但是在您的create.blade.php
文件中,您未提交与total
有关的任何内容。结果,验证返回错误,但您甚至没有显示它。因此,您认为表单没有被卡住。实际上,它需要重定向并返回验证错误total
。
第二个问题
对于这种解决方案,我不是100%肯定的,但是您可以尝试以下的mutator。模型。
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);
现在检查它是否有效。