首页 > 解决方案 > 如何在 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更早地使用两行而不会出现问题。

标签: phplaravel

解决方案


如果您的路由模型绑定设置正确,那么您是否将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您正在引用哪个对象。

您可以:

  1. 修改您的路线以包含此路线参数

或者

  1. 使用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');
}

推荐阅读