как вставить один товар во многие категории laravel attach () - PullRequest
0 голосов
/ 27 июня 2018

Я пытался много времени, но не смог. Пример: я хочу получить результат, например, если я вставлю Продукт в базу данных, выберу несколько категорий и сохраню их в другой таблице, а затем покажу мне ошибку, подобную этой:

SQLSTATE[42S02]: Base table or view not found: 1146 Table 'space.category_product' doesn't exist (SQL: insert into `category_product` (`category_id`, `product_id`) values (1, ))

Если я переименую таблицу базы данных Из категории_продукции в категорию_продукта вручную, покажу мне новую ошибку здесь:

SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'product_id' cannot be null (SQL: insert into `category_product` (`category_id`, `product_id`) values (1, ))

Вот мой код базы данных

Schema::create('products', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('model');
            $table->string('slug')->unique();
            $table->string('availability');
            $table->float('price');
            $table->longText('images');
            $table->text('short_detail');
            $table->text('feature');
            $table->longText('purchase_delivery');
            $table->longText('replace_policy');
            $table->timestamps();
        });
    Schema::create('categories', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->string('slug');
        $table->timestamps();
    });
    Schema::create('category_products', function (Blueprint $table) {
        $table->increments('id');

        $table->integer('product_id')->unsigned();
        $table->foreign('product_id')->references('id')->on('products')->onUpdate('cascade')->onDelete('cascade');

        $table->integer('category_id')->unsigned();
        $table->foreign('category_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('cascade');
        $table->timestamps();
    });

Вот мои модели:

class Category extends Model
{
    public function Products()
    {
        return $this->belongsToMany(Product::class);
    }
}
class Product extends Model
{
    public function Categories()
    {
        return $this->belongsToMany(Category::class);
    }
}

ProductController:

 public function store(Request $request)
    {
        if ($request->hasFile('file')){
            foreach ($request->file as $file) {
                $fileExt = $file->getClientOriginalExtension();
                $uniqId = uniqid('img-');
                $fileName[] =$uniqId.'.'.$fileExt;
                $Name = $uniqId.'.'.$fileExt;
                $file->move('public/uploads',$Name);
            }
            $images = implode(",",$fileName);
            $product = new Product();
            $product->Categories()->attach($request->categories_id);
            $product->name= $request->input('name');
            $product->model= $request->input('model');
            $product->slug= $request->input('slug');
            $product->availability= $request->input('availability');
            $product->price= $request->input('price');
            $product->images= $images;
            $product->short_detail= $request->input('short_detail');
            $product->feature= $request->input('feature');
            $product->purchase_delivery= $request->input('purchase_delivery');
            $product->replace_policy= $request->input('replace_policy');
            if ($product->save()) {
                return redirect()->route('product.index')
                    ->with('success', 'Product Added successfully');
            }
            return back()->withInput()->with('errors', 'Error Adding New Product');
        }
    }

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Здесь вы можете использовать свои модели

class Category extends Model
{
    public function Products()
    {
        return $this->belongsToMany(Product::class, 'category_products');
    }
}
class Product extends Model
{
    public function Categories()
    {
        return $this->belongsToMany(Category::class, 'category_products);
    }
}

Здесь category_products - сводная таблица.

Сохранить сейчас

$product = Product::create(['name' => 'product1']);
$product->Categories()->sync([1, 3, 4]);

OR

$product->Categories()->attach([1, 3, 4]);

Разница

Синхронизация: Вы также можете использовать метод синхронизации для построения ассоциаций «многие ко многим». Метод синхронизации принимает массив идентификаторов для размещения на промежуточный стол Любые идентификаторы, которых нет в данном массиве, будут снято с промежуточного стола. Итак, после этой операции завершено, только идентификаторы в данном массиве будут существовать в промежуточный стол:

Attach: Это то же самое, что и append, добавление новых значений к уже существующим

0 голосов
/ 27 июня 2018
  Schema::create('category_product', function (Blueprint $table) {
        $table->increments('id');

        $table->integer('product_id')->unsigned();
        $table->foreign('product_id')->references('id')->on('products')->onUpdate('cascade')->onDelete('cascade');

        $table->integer('category_id')->unsigned();
        $table->foreign('category_id')->references('id')->on('categories')->onUpdate('cascade')->onDelete('cascade');
        $table->timestamps();
    });

У вас есть опечатка на имя должно быть category_product.

Ваше имя таблицы должно быть в алфавитном порядке и использовать имена в единственном числе.

Если вы не хотите изменять имена таблиц

 public function Categories()
    {
        return $this->belongsToMany(Category::class, 'category_products,'category_id', 'product_id');
    }

Мой ProductController:

 public function store(Request $request)
    {
        if ($request->hasFile('file')){
            foreach ($request->file as $file) {
                $fileExt = $file->getClientOriginalExtension();
                $uniqId = uniqid('img-');
                $fileName[] =$uniqId.'.'.$fileExt;
                $Name = $uniqId.'.'.$fileExt;
                $file->move('public/uploads',$Name);
            }
            $images = implode(",",$fileName);
            $product = new Product();
            $product->name= $request->input('name');
            $product->model= $request->input('model');
            $product->slug= $request->input('slug');
            $product->availability= $request->input('availability');
            $product->price= $request->input('price');
            $product->images= $images;
            $product->short_detail= $request->input('short_detail');
            $product->feature= $request->input('feature');
            $product->purchase_delivery= $request->input('purchase_delivery');
            $product->replace_policy= $request->input('replace_policy');

            $product->save();
            $product->Categories()->attach($request->categories_id);

            if ($product->save()) {
                return redirect()->route('product.index')
                    ->with('success', 'Product Added successfully');
            }
            return back()->withInput()->with('errors', 'Error Adding New Product');
        }
    }

Используйте $product->categories()->attach($category_id) после $product->save()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...