php - 如何在 laravel 的表单动作中传递一个值
问题描述
我有一个列出数据库中所有对象的视图,并为每个对象创建一个表单以保存到不同的表中。我的问题是,该值没有传递给我的函数。
这是我的 Blade.php 文件:
@extends('layouts.app')
@section('content')
<div class="container">
<div class="row justify-content-center">
<div class="col-md-12">
<div class="card">
<div class="card-header">{{ __('Items') }}</div>
<div class="card-body">
<div class="row">
@foreach($items as $item)
<div class="col-md-3 col-xs-12">
<div class="card">
<img src="..." class="card-img-top" alt="...">
<div class="card-body">
<h5 class="card-title">{{ $item->name }}</h5>
<p class="card-text">$ {{ $item->price }}</p>
@auth
<form method="post" action="{{ route('carts.store', $item) }}">
@csrf
@method('post')
<button type="submit" class="form-control btn">add to cart</button>
</form>
@endauth
<form method="post" action="{{ route('item.destroy', $item) }}">
@csrf
@method('delete')
<button type="submit" class="form-control btn btn-danger">delete</button>
</form>
</div>
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
和我在 CartsController 中的函数:
public function store(Item $item)
{
$cart = new Cart();
$cart->user_id = auth()->id();
$cart->item_id = $item->id;
$cart->save();
return redirect('/item');
}
当我单击添加到购物车时,我收到此错误:
SQLSTATE [23000]:完整性约束违规:1048 列“item_id”不能为空(SQL:插入“购物车”(“user_id”、“item_id”、“updated_at”、“created_at”)值(1、?、2020- 08-24 07:35:44, 2020-08-24 07:35:44))
我尝试将 id 直接传递给函数,但这似乎也不起作用。我很困惑为什么会发生这种情况,因为我可以$item
更早地使用两行而不会出现问题。
解决方案
如果您的路由模型绑定设置正确,那么您是否将id
对象或对象本身传递给route()
函数实际上并不重要。
https://laravel.com/docs/7.x/routing#implicit-binding
当你运行时php artisan route:list
,你应该会看到类似这样的东西:
POST | cart/store/item/{item} | carts.store | App\Http\Controllers\CartController@store
Laravel 自动解析定义在路由或控制器操作中的 Eloquent 模型,其类型提示的变量名称与路由段名称匹配。
因此,以下任何一项实际上都会起作用
{{ route('carts.store', $item) }}
或者
{{ route('carts.store', $item->id) }}
或者
{{ route('carts.store', ['item' => $item->id]) }}
所有人都应该解决同一件事。
附录
因此,您使用的路由没有您的项目的路由参数(即{item}
),因此它不会知道Item
您正在引用哪个对象。
您可以:
- 修改您的路线以包含此路线参数
或者
- 使用
Request
对象来解决Item
。
刀
<form method="post" action="{{ route('carts.store') }}">
@csrf
@method('post')
<input type="hidden" name="item_id" value="{{ $item->id }}">
<button type="submit" class="form-control btn">add to cart</button>
</form>
控制器
public function store(Request $request)
{
$cart = new Cart();
$cart->user_id = auth()->id();
$cart->item_id = $request->item_id;
$cart->save();
return redirect('/item');
}
推荐阅读
- javascript - TradingView 没有在 Vue 挂载的钩子中定义
- angularjs - 错误:未定义不是对象(评估'$scope.$storage.match_id')
- python - 无法将 pyexcel-xls 与 pyinstaller python 3.6 版一起使用
- optimization - 声纳报告中的认知复杂性是什么?
- java - Android:在fragment类中,通过getter方法访问Activity类的变量,变量的值保持为0
- laravel - 用函数替换 Laravel 查询回调
- javascript - JS 或 jQuery。单击按钮时显示不同的导航
- .net-core - 无法在 VSTS 上为 blazor 创建管道
- amazon-web-services - 无法连接到端点发电机数据库 Windows 10
- python - 是否可以让网络爬虫使用插件(在 Chrome 的扩展栏中)?