После добавления редактора TinyMCE вместо универсального редактора, который у меня был, я получаю ошибку SQLSTATE [23000]: нарушение ограничения целостности. Проведя некоторое исследование, я понял, что мне не хватает тега name
. Но добавление этого ничего не изменило. Я добавил свой код ниже.
файл лезвия
<div class = "row" style = "padding-top: 15px;">
<div class = "col-lg-10 col-md-10">
<div class = "card card-primary">
<div class = "card-header">
<h3 class = "card-title">Add Product</h3>
</div>
<!-- /.card-header -->
<!-- form start -->
<form role = "form" action = "{{ route('product.store') }}" method = "post" enctype = "multipart/form-data">
{{ csrf_field() }}
<div class = "card-body">
<div class = "form-group">
<label for = "productName">Product Name</label>
<input type = "text" class = "form-control" id = "productName" name = "productName" placeholder = "Product Name">
</div>
<div class = "form-group">
<label for = "slug">Slug</label>
<input type = "text" class = "form-control" id = "slug" name = "slug" placeholder = "slug">
</div>
<div class = "form-group">
<div class = "pull-right">
<label for = "image">File input</label>
<input type = "file" name = "image" id = "image">
</div>
</div>
</div>
<div class = "row">
<div class = "col-md-12">
<div class = "card card-outline card-info">
<div class = "card-header">
<h3 class = "card-title">
Product Description
</h3>
</div>
<!-- /.card-header -->
<div class = "card-body pad">
<div class = "mb-3">
<textarea id = "basic-conf" class = "textarea" name = "description" placeholder = "Place some text here" style = "width: 100%; height: 200px; font-size: 14px; line-height: 18px; border: 1px solid #dddddd; padding: 10px;"></textarea>
</div>
</div>
</div>
</div>
<!-- /.col-->
</div>
<!-- /.card-body -->
<div class = "card-footer">
<input type = "submit" class = "btn btn-primary">
<a href='{{ route('product.index') }}' class = "btn btn-warning">Back</a>
</div>
</form>
</div>
</div>
</div>
контроллер
public function store(Request $request)
{
$this->validate($request, [
'productName'=>'required',
'slug'=>'required',
'image'=>'required',
'description'=>'required',
]);
$product = new product();
$product->product_name = $request->productName;
if ($request->hasFile('image')) {
$image = $request->file('image');
$image_name = time() . $image->getClientOriginalName();
$destinationPath = public_path('/uploads/products');
$image->move($destinationPath, $image_name);
$product->image = $image_name;
}
$product->slug = $request->slug;
$product->description = $request->productDescription;
$product->save();
return redirect(route('product.index'));
}
файл миграции
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->bigIncrements('id');
$table->string('product_name');
$table->string('slug')->unique();
$table->text('description');
$table->string('image');
$table->timestamps();
});
}
Вы назвали текстовое поле «описание»
<div class = "card-body pad">
<div class = "mb-3">
<textarea id = "basic-conf" class = "textarea" name = "description" placeholder = "Place some text here" style = "width: 100%; height: 200px; font-size: 14px; line-height: 18px; border: 1px solid #dddddd; padding: 10px;"></textarea>
</div>
</div>
И вы пытаетесь получить значение по ключу "productDescription" объекта $request, который, естественно, возвращает значение null.
Пытаться
public function store(Request $request)
{
$this->validate($request, [
'productName'=>'required',
'slug'=>'required',
'image'=>'required',
'description'=>'required',
]);
$product = new product();
$product->product_name = $request->productName;
if ($request->hasFile('image')) {
$image = $request->file('image');
$image_name = time() . $image->getClientOriginalName();
$destinationPath = public_path('/uploads/products');
$image->move($destinationPath, $image_name);
$product->image = $image_name;
}
$product->slug = $request->slug;
$product->description = $request->description; //changed from productDescription to description
$product->save();
return redirect(route('product.index'));
}
Спасибо. Я понял это через час после публикации этого вопроса.