Полиморфный тип 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');
}

0 ответов

Другие вопросы по тегам