Как передать значение в действии формы в laravel

#php #laravel

#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: вставить в `carts` (`user_id`, `item_id`, `updated_at`, `created_at`) значения (1, ?, 2020-08-24 07:35:44, 2020-08-24 07:35:44))

Я пытался передать идентификатор функции напрямую, но это также, похоже, не работает. Я очень смущен тем, почему это происходит, поскольку я могу использовать $item две строки ранее без проблем.

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

1. Вы используете неявную или явную привязку к модели маршрута?

2. я думаю, неявное. Я все еще новичок в php и laravel

3. Вы предполагаете передать $item->id как в action="{{ route('carts.store', $item->id ) }}" .

Ответ №1:

При условии, что ваша привязка модели маршрута настроена правильно, на самом деле не будет иметь значения, передаете ли вы id объект или сам объект в route() функцию.

https://laravel.com/docs/7.x/routing#implicit-binding

При запуске php artisan route:list вы должны увидеть что-то похожее на это:

 POST | cart/store/item/{item} | carts.store | AppHttpControllersCartController@store 
  

Laravel автоматически разрешает модели Eloquent, определенные в маршрутах или действиях контроллера, имена переменных с указанием типа которых соответствуют имени сегмента маршрута.

Таким образом, любое из следующих действий действительно будет работать

 {{ route('carts.store', $item) }}
  

или

 {{ route('carts.store', $item->id) }}
  

или

 {{ route('carts.store', ['item' =>  $item->id]) }}
  

Все должно разрешаться одинаково.


Дополнение

Таким образом, используемый вами маршрут не имеет параметра route для вашего элемента (т. е. {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');
}
  

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

1. php artisan routes:list возвращает это, POST | carts | carts.store | AppHttpControllersCartsController@store | web $fillable Массив также настроен правильно. Но это все еще не работает

2. Смотрите добавление к моему ответу с объяснением того, что происходит