Laravel ошибка отношения многие ко многим на foreach

У меня есть 2 таблицы, называемые продуктами и категорией продуктов, принадлежащих категории и категории, принадлежащих к многим продуктам, вот моя схема таблицы

 Schema::create('products', function (Blueprint $table) {
    $table->increments('id');
    $table->timestamps();
    $table->string('image');
    $table->string('stock');
    $table->string('title');
    $table->string('slug')->unique();
    $table->string('gender');
    $table->text('description');
    $table->integer('price');
    $table->integer('user_id')->unsigned();
    $table->foreign('user_id')->references('id')->on('users')
                ->onDelete('restrict')
                ->onUpdate('restrict');

    $table->dateTime('published_at');
});

вот моя схема таблицы категорий

Schema::create('categories', function (Blueprint $table) {
    $table->increments('id');
    $table->integer('categorydesigner_id')->unsigned()->index();
    $table->string('name')->unique();
    $table->timestamps();
});

Schema::create('category_product', function (Blueprint $table) {
    $table->integer('product_id')->unsigned()->index();
    $table->integer('category_id')->unsigned()->index();
    $table->foreign('category_id')->references('id')->on('categories')
                ->onDelete('restrict')
                ->onUpdate('restrict');
    $table->foreign('product_id')->references('id')->on('products')
                ->onDelete('restrict')
                ->onUpdate('restrict');
    $table->timestamps();
});

вот мой контроллер

public function productpost(Request $request){

    $this->validate($request, [
        'title' => 'required|max:255',
        'description' => 'required',
        'price' => 'required',
        'image' => 'image|required',
    ]);

    $designer_name = $request->designer;
    $designer_slug = str_random(40);
    $designer = designer::where('name', $designer_name)->firstOrCreate(
            ['name' => $designer_name], ['slug' => $designer_slug]
        );
    $designer->name = $designer_name;
    $designer->slug = $designer_slug;
    $designer->save();
    $designer_id = $designer->id;
    $product = new Product;
    $product->title = $request->title;
    $product->designer_id = $designer_id;
    $product->description = $request->description;
    $product->price = $request->price;
    $product->stock = $request->stock;
    $product->gender = $request->gender;
    $product_slug = str_random(40);
    $product->slug = $product_slug;
    $product->user_id = Auth::user()->id;
    $product->published_at = Carbon::now()->format('Y-m-d');
    if($request->hasFile('image')) {
        $file = Input::file('image');
        //getting timestamp
        $timestamp = str_replace([' ', ':'], '-', Carbon::now()->toDateTimeString());
        $name = $timestamp. '-' .$file->getClientOriginalName();
        $file->move(public_path().'/images/product/', $name);
        $product->image = $name;
        $thumb = Image::make(public_path().'/images/product/' . $name)->resize(1200,1800)->save(public_path().'/images/product/thumb/' . $name, 90);  
    }
    $product->save();
    $productsearch = product::where('slug', $product_slug)->firstorfail();
    $product_id = $productsearch->id;
    $categoryname = $request->category;
        foreach ($categoryname as $name) {
            $category = category::where('name', $name)->firstOrCreate(['name' => $name, 'categorydesigner_id' => $designer_id]);
            $category->name = $name;
            $category->categorydesigner_id = $designer_id;
            $category->save();
            $category->products()->attach($product_id);
        }
    return Redirect::back()->with('status', 'Post Success');
}

в моем коде я делаю firstOrCreate, если у категории уже есть идентификатор и прикреплен, но я получаю сообщение об ошибке SQLSTATE [23000]: нарушение ограничения целостности: 1062 Дублирующаяся запись «плавать» для ключа «categories_name_unique», помогите мне, спасибо


person Sid Heart    schedule 29.08.2017    source источник


Ответы (1)


Поскольку вы все равно собираетесь сохранять экземпляр, вы также можете использовать firstOrNew:

$category = category::firstOrNew(['name' => $name]);
$category->categorydesigner_id = $designer->id;
$category->save();
$category->products()->attach($product_id);

Это должно избавиться от ошибки.

Надеюсь это поможет!

person Rwd    schedule 29.08.2017