Когда я пытаюсь получить продукт и командую им, я получаю «Illuminate\Database\QueryException
SQLSTATE [23000]: нарушение ограничения целостности: 1048 Имя столбца не может быть нулевым (SQL: вставить в commande
(name
, familyname
, quantity
, mobile
, ville
, adresse
, id_product
, user_id
, updated_at
, created_at
) значения (?, ?, ?, ?, ?, ?, ?, ?, 21.11.2022 21:30:27, 21.11.2022 21:30:27))"
Я пытаюсь управлять продуктом, в котором у каждого продукта есть разные пользователи. Я использую внешний ключ в таблице продуктов (user_id), и у каждой команды есть пользователь для ее проверки.
Это моя функция в контроллере:
public function getProduct($id, Request $request)
{
$product = Product::find($id);
$commande = new AppCommande;
$commande->name = $request->input('name');
$commande->familyname = $request->input('familyname');
$commande->quantity = $request->input('quantity');
$commande->mobile = $request->input('mobile');
$commande->ville = $request->input('ville');
$commande->adresse = $request->input('adresse');
$commande->id_product = $request->input('id_product');
$commande->user_id = $request->input('id_user');
$commande->save();
return view('product', ['product' => $product], ['commande' => $commande]);
}
Это мой маршрут:
Route::get('/product/{id}', \[ 'uses' =\> 'CommandeUserController@getProduct', 'as' =\> 'product.single' \]);
а это вид:
@extends('layouts.app')
@section('content')
<div class="col-sm-6 col-md-4">
<div class="thumbnail">
<img src="{{ asset('uploads/product/'.$product->image) }}" width="90px" alt="image">
<div class="caption">
<h3> {{$product->name}} </h3>
<p class="discription"> {{$product->description}} </p>
<div class="clearfix">
<div class="pull-left price"/>$ {{$product->price}}</div>
{{-- <a href= {{ route('commander', ['id' => $product->id ]) }} class="btn btn-danger pull-right" role="button">Commander ce produit</a> --}}
</div>
</div>
</div>
<div class="card">
<div class="card-header">
Create Commande
</div>
<div class="card-body">
<form action="{{ route("admin.commandes.store") }}" method="POST" enctype="multipart/form-data">
@csrf
<div class="form-group {{ $errors->has('name') ? 'has-error' : '' }}">
<label for="name">Name</label>
<input type="text" id="name" name="name" class="form-control" value="{{ old('name', isset($commande) ? $commande->name : '') }}">
@if($errors->has('name'))
<em class="invalid-feedback">
{{ $errors->first('name') }}
</em>
@endif
<p class="helper-block">
{{ trans('global.product.fields.name_helper') }}
</p>
</div>
<div class="form-group {{ $errors->has('familyname') ? 'has-error' : '' }}">
<label for="name">Family Name</label>
<input type="text" id="familyname" name="familyname" class="form-control" value="{{ old('familyname', isset($commande) ? $commande->familyname : '') }}">
@if($errors->has('name'))
<em class="invalid-feedback">
{{ $errors->first('name') }}
</em>
@endif
<p class="helper-block">
{{ trans('global.product.fields.name_helper') }}
</p>
</div>
<div class="form-group {{ $errors->has('mobile') ? 'has-error' : '' }}">
<label for="quantity">Mobile</label>
<input type="number" id="mobile" name="mobile" class="form-control" value="{{ old('mobile', isset($commande) ? $commande->mobile : '') }}" step="1">
@if($errors->has('mobile'))
<em class="invalid-feedback">
{{ $errors->first('mobile') }}
</em>
@endif
<p class="helper-block">
{{ trans('global.product.fields.price_helper') }}
</p>
</div>
<div class="form-group {{ $errors->has('quantity') ? 'has-error' : '' }}">
<label for="quantity">Quantity</label>
<input type="number" id="quantity" name="quantity" class="form-control" value="{{ old('quantity', isset($commande) ? $commande->quantity : '') }}" step="1">
@if($errors->has('price'))
<em class="invalid-feedback">
{{ $errors->first('price') }}
</em>
@endif
<p class="helper-block">
{{ trans('global.product.fields.price_helper') }}
</p>
</div>
<div class="form-group {{ $errors->has('ville') ? 'has-error' : '' }}">
<label for="ville">City</label>
<input type="text" id="ville" name="ville" class="form-control" value="{{ old('ville', isset($commande) ? $commande->familyname : '') }}">
@if($errors->has('ville'))
<em class="invalid-feedback">
{{ $errors->first('ville') }}
</em>
@endif
<p class="helper-block">
{{ trans('global.product.fields.name_helper') }}
</p>
</div>
<div class="form-group {{ $errors->has('adresse') ? 'has-error' : '' }}">
<label for="adress">Adresse</label>
<input type="text" id="adresse" name="adresse" class="form-control" value="{{ old('adresse', isset($commande) ? $commande->adresse : '') }}">
@if($errors->has('adresse'))
<em class="invalid-feedback">
{{ $errors->first('adresse') }}
</em>
@endif
<p class="helper-block">
{{ trans('global.product.fields.name_helper') }}
</p>
</div>
<input type="hidden" name="id_product" value=" {{ $product->id }}" />
<input type="hidden" name="user_id" value=" {{ $product->user_id }}" />
<input class="btn btn-danger" type="submit" value="{{ trans('global.save') }}">
</div>
</form>
</div>
</div>
@endsection
Я пытаюсь заполнить имя, но ошибка возникает перед формой для заполнения
зачем getProduct
создает запись? у вас должен быть маршрут POST, который создает эту запись, маршрут GET, который возвращает представление, должен просто собирать необходимые данные для возвращаемого представления.
Да, конечно. Если маршрут, который вы используете для отображения формы, также ожидает ввода из формы, как вы ожидаете, что это будет работать? Вам нужно разделить маршруты. Опять же, посмотрите на тот контроллер ресурсов, который я связал; он показывает, как контроллер должен использовать отдельные маршруты: один GET
для отображения формы создания, один POST
для обработки отправки формы, еще один GET
и POST
для редактирования и т. д. и т. д.
Поскольку мне кажется странным, что ваше сообщение об ошибке не принимает никакого значения из вашего запроса, попробуйте добавить переменную $commande в стандартную скобку '()' при последней инициализации модели.
$commande = new AppComande();
Что ж, я изменил создание команды на другую функцию, теперь я получаю: Свойство [имя] не существует в этом экземпляре коллекции.
@MalikKadri Если у вас возникла новая проблема, задайте новый вопрос. Но, с учетом сказанного, сначала выполните поиск этой ошибки в Stackoverflow; вы не единственный, у кого была эта ошибка: stackoverflow.com/questions/70030106/… , stackoverflow.com/questions/41366092/… , stackoverflow.com/questions/63219872/… . Скорее всего, вы используете ->get()
вместо того, чтобы использовать ->first()
.
Как сейчас написано, ваш ответ неясен. Пожалуйста, отредактируйте , чтобы добавить дополнительные сведения, которые помогут другим понять, как это отвечает на заданный вопрос. Вы можете найти больше информации о том, как писать хорошие ответы в справочном центре.
Здравствуйте, я изменил getProduct() на и он работает:
public function getProduct($id, Request $request)
{
$product = Product::find($id);
return view('product', ['product' => $product]);
}
и я использовал в форме новую функцию магазина для команды:
public function store(StoreProductRequest $request)
{
$user_id=auth()->user()->id;
$commande = new AppCommande();
$commande->name = $request->input('name');
$commande->familyname = $request->input('familyname');
$commande->quantity = $request->input('quantity');
$commande->mobile = $request->input('mobile');
$commande->ville = $request->input('ville');
$commande->adresse = $request->input('adresse');
$commande->id_product = $request->input('id_product');
$commande->user_id=$user_id;
$commande->save();
return redirect('/commandeuser/confirm')->with('status', 'commande ajoutée!');
}
Вы действительно заполняете
<input>
вместоname
? У вас нет никакой проверки, поэтому, если вы ее не заполните, а ваша база данных не позволяетnull
, вы получите эту ошибку. Кроме того, вы не должны использоватьRoute::get()
для создания чего-либо. Взгляните на контроллеры ресурсов Laravel, чтобы увидеть типичный подход: laravel.com/docs/9.x/controllers#resource-controllers