#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
объект вы ссылаетесь.
Вы можете либо:
- Измените свой маршрут, чтобы включить этот параметр маршрута
или
- вместо этого используйте
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. Смотрите добавление к моему ответу с объяснением того, что происходит