в моей базе данных у меня есть product_category
и products
, в которых один product
может принадлежать одной или какой-либо категории в таблице product_category
, теперь мой вопрос: когда пользователь отправляет продукт с одной или какой-либо категорией, как я могу сохранить это в базе данных, например, для одной категории есть один или какой-то продукт?
в виду, у меня есть несколько вариантов:
{{ Form::select('categories[]', $productCategories, null, array('class' => 'multiselect-success multiselect_selected','multiple'=>'multiple')) }}
модель products
:
class Products extends Model { protected $table = 'products'; protected $guarded = ['id']; protected $casts = [ 'images' => 'array' ]; public function productCategories() { return $this->belongsTo(ProductCategories::class); } }
productCategories
модель:
class ProductCategories extends Model { protected $table = 'product_categories'; protected $guarded =['id']; protected $casts=[ 'images'=>'array' ]; public function products() { return $this->hasMany(Products::class); } }
и store
функцию в controller
:
public function store(RequestProducts $request) { try { $data = Products::create([ 'name' => $request->name, 'amount' => $request->amount, 'product_code' => $request->product_code, 'weight' => $request->weight /* MY PROBLEM IS HERE */ 'category_id' => $request->categories ]); } catch (Exception $ex) { ... } return redirect(route('manageProductCategories.index')); }
в categories
просмотра html есть массив и как я могу это реализовать?
ОБНОВИТЬ
после обновления кода с помощью createMany
я получаю эту ошибку:
General error: 1364 Field 'category_id' doesn't have a default value (SQL: insert into `products` (`name`, `lang`, `amount`, `product_code`, `weight`, `images`, `updated_at`, `created_at`) values (eqweqwe, fa, 45,000, asd, asdasd, '', 2017-12-09 04:45:44, 2017-12-09 04:45:44))
файлы миграции:
public function up() { Schema::create('product_categories', function (Blueprint $table) { $table->increments('id'); $table->string('category_name'); $table->string('lang', 2); $table->text('images'); $table->timestamps(); }); } public function up() { Schema::create('products', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('amount'); $table->string('product_code'); $table->string('weight'); $table->string('lang', 2); $table->text('images'); $table->integer('category_id')->unsigned()->index(); $table->foreign('category_id')->references('id')->on('product_categories')->onDelete('cascade'); $table->timestamps(); }); }
Из вашего вопроса и комментариев я понимаю следующее.
Многие продукты могут иметь категорию «category_1», а «product_1» может принадлежать многим категориям.
Чтобы реализовать это, вы должны использовать отношения «Многие для многих». Я обновил ваш код, это может вам помочь.
Миграции:
public function up() { Schema::create('product_categories', function (Blueprint $table) { $table->increments('id'); $table->string('category_name'); $table->string('lang', 2); $table->text('images'); $table->timestamps(); }); } public function up() { Schema::create('products', function (Blueprint $table) { $table->increments('id'); $table->string('name'); $table->string('amount'); $table->string('product_code'); $table->string('weight'); $table->string('lang', 2); $table->text('images'); $table->timestamps(); }); } public function up() { Schema::create('products_product_category', function (Blueprint $table) { $table->integer('product_id'); $table->integer('product_category_id'); }); }
модели
модель продукта:
class Products extends Model { protected $table = 'products'; protected $guarded = ['id']; protected $casts = [ 'images' => 'array' ]; public function productCategories() { return $this->belongsToMany(ProductCategories::class,'products_product_category'); } }
productCategories модель:
class ProductCategories extends Model { protected $table = 'product_categories'; protected $guarded =['id']; protected $casts=[ 'images'=>'array' ]; public function products() { return $this->belongsToMany(Products::class, 'products_product_category'); } }
контроллер
public function store(RequestProducts $request) { try { $data = Products::create([ 'name' => $request->name, 'amount' => $request->amount, 'product_code' => $request->product_code, 'weight' => $request->weight ]); $data->productCategories()->sync($request->categories); } catch (Exception $ex) { ... } return redirect(route('manageProductCategories.index')); }
Надеюсь, это поможет.