Полиморфный тип Laravel не хранится правильно
Я использую Backpack для создания панели администратора для своего проекта. У меня есть модель SoldProduct (в основном физическая вещь, проданная клиенту), модель обуви и модель толстовки. Между ними существует полиморфная связь, чтобы иметь отдельную таблицу для каждого из них, избегая повторения столбцов, которые они разделяют, а также избегая (своего рода уродливого) решения их хранения в большой таблице, в которой есть все необходимое. поля, которые останутся частично нулевыми в зависимости от типа хранимого продукта.
Поскольку я использую CRUD Backpack, я создал собственный метод магазина, который создает определенные типы продуктов, а затем создает объект SoldProduct, связанный с конкретным (путем заполнения полей productable_type и productable_id).
Проблема в том, что пока
productable_id
хранится правильно, в
productable_type
поле вместо хранения, например
"App\Models\Shoe"
Я продолжаю получать (название родительской модели), и я не знаю, откуда она это берется. Данные правильно передаются в "последний" метод хранилища, но в процессе сохранения они изменяются в
"App\Models\SoldProduct"
.
Есть какие-нибудь подсказки, почему это может происходить? Спасибо всем.
Вот мой код
public function store(Request $request) {
$this->crud->setRequest($this->crud->validateRequest());
$productable_type = $request->request->get('productable_type');
switch ($productable_type) {
case "Shoe":
$product = new Shoe;
$product->imprinted_code = $request->request->get('imprinted_code');
$product->size = $request->request->get('shoe_size');
$product->sole = $request->request->get('sole');
$product->save();
$product_id = $product->id;
$this->crud->addField(['type' => 'hidden', 'name' => 'productable_id']);
$this->crud->getRequest()->request->add(['productable_id' => "$product_id"]);
$this->crud->getRequest()->request->add(['productable_type' => "App\Models\\$productable_type"]);
break;
// repeat for Sweatshirt too
}
$this->removeField('imprinted_code', $request);
$this->removeField('shoe_size', $request);
$this->removeField('sole', $request);
$this->removeField('sweatshirt_size', $request);
$this->removeField('shirt_size', $request);
$this->removeField('pants_size', $request);
$this->crud->unsetValidation();
return $this->traitStore();
}
sold_products_table
Schema::create('sold_products', function (Blueprint $table) {
$table->id();
$table->foreignId('product_model_id')->constrained('product_models');
$table->foreignId('owner_id')->nullable()->constrained('users')->onUpdate('cascade');
$table->integer('productable_id')->nullable();
$table->string('productable_type')->nullable();
$table->string('note')->nullable();
$table->timestamps();
});
Продано
public function productable() {
return $this->morphTo();
}
Обувь
Фуфайка
public function product() {
return $this->morphOne('App\Models\SoldProduct', 'productable');
}