简体   繁体   中英

"Array to string conversion" while using relationships laravel 8

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM