I'm trying to create an article with more than one categories using Many to Many relationship but I receive "Array to string conversion" error.
I also have a pivot table in my database called "article_category" here is my codes:
my Article Model:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Article extends Model
{
use HasFactory;
protected $fillable = [
'name',
'slug',
'description',
'status',
'categories',
];
protected $attributes =[
'hits' => 10
];
public function categories ()
{
return $this->belongsToMany (Category::class);
}
}
my Category Model:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Category extends Model
{
use HasFactory;
protected $fillable = [
'name',
'slug',
];
public function articles ()
{
return $this->belongsToMany (Article::class);
}
}
my create method:
public function create()
{
$categories = Category::all()->pluck('name' , 'id');
return view('back.articles.create' , compact ('categories'));
}
my store method:
$validatedData = $request->validate([
'name'=>'required',
'slug'=>'required|unique:categories',
], $messages=[
'name.required' => 'Name field can't be empty.',
'slug.unique' => 'Slug field already exists.',
'slug.required' => 'Slug field can't be empty.',
]);
$article = new Article();
try {
$article = $article->create($request->all());
$article->categories()->attach($request->categories);
} catch (Exception $exception) {
switch ($exception->getCode()) {
case 23000:
$msg = "Slug field already exists.";
break;
}
return redirect(route('admin.article'))->with('warning' , $msg);
}
$msg = "New category created successfully.";
return redirect(route('admin.articles'))->with('success', $msg);
my web.php:
Route::group([
'prefix' => 'categories',
'middleware' => \App\Http\Middleware\CheckRole::class,
], function () {
Route::get('/',[CategoryController::class, 'index'])->name('admin.categories');
Route::get('/create',[CategoryController::class, 'create'])->name('create.category');
Route::get('/edit/{category}',[CategoryController::class, 'edit'])->name('edit.category');
Route::post('/store',[CategoryController::class, 'store'])->name('store.category');
Route::put('/update/{category}',[CategoryController::class, 'update'])->name('update.category');
Route::get('/delete/{category}',[CategoryController::class, 'destroy'])->name('delete.category');
});
Route::group([
'prefix' => 'articles',
'middleware' => \App\Http\Middleware\CheckRole::class,
], function () {
Route::get('/',[ArticleController::class, 'index'])->name('admin.articles');
Route::get('/create',[ArticleController::class, 'create'])->name('create.article');
Route::get('/edit/{article}',[ArticleController::class, 'edit'])->name('edit.article');
Route::post('/store',[ArticleController::class, 'store'])->name('store.article');
Route::put('/update/{article}',[ArticleController::class, 'update'])->name('update.article');
Route::get('/delete/{article}',[ArticleController::class, 'destroy'])->name('delete.article');
});
my create form:
<form action="{{ route('store.article') }}" method="POST">
@csrf
<div class="form-icon">
<span><i class="icon icon-user"></i></span>
</div>
<div class="form-group">
<input type="text" class="form-control @error ('name') is-invalid @enderror" name="name"
placeholder="name" value="{{ old('name') }}">
@error('name')
<div class="alert alert-danger" style="text-align: center">{{ $message }}</div>
@enderror
</div>
<div class="form-group">
<input type="text" class="form-control @error ('slug') is-invalid @enderror" name="slug"
placeholder="slug" value="{{ old('slug') }}">
@error('slug')
<div class="alert alert-danger" style="text-align: center">{{ $message }}</div>
@enderror
</div>
<div class="form-group">
<textarea type="text" class="form-control @error ('description') is-invalid @enderror"
name="description" placeholder="description">{{ old('description') }}</textarea>
@error('description')
<div class="alert alert-danger" style="text-align: center">{{ $message }}</div>
@enderror
</div>
<div class="form-group">
<select class="form-group" name="status">
<option value="0">published</option>
<option value="1">unpublished</option>
</select>
</div>
<div class="form-group">
<label for="title">author: {{ Auth::user()->name }} </label>
<input type="hidden" name="user_id" value="Auth::user()->id">
</div>
<div class="form-group">
<label for="title">Choose a category: </label>
<div id="output"></div>
<select data-placeholder="Choose a category..." class="chosen-select" multiple name="categories[]" style="width: 400px">
@foreach ($categories as $cat_id => $cat_name)
<option value="{{ $cat_id }}">{{ $cat_name }}</option>
@endforeach
</select>
</div>
</div>
<div class="form-group">
<button type="submit" class="btn btn-block create-account">ایجاد</button>
</div>
</form>
I think you must escape the single ticks here:
$validatedData = $request->validate([
'name'=>'required',
'slug'=>'required|unique:categories',
], $messages=[
'name.required' => 'Name field can\'t be empty.',
'slug.unique' => 'Slug field already exists.',
'slug.required' => 'Slug field can\'t be empty.',
]);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.