首页 > 解决方案 > Laravel 背包多态 CRUD 字段

问题描述

我希望能够使用 Backpack CRUD 处理多态关系。我找不到任何好的解释,我正在努力在他们的其他包(例如 PermissionManager)中取消它的实现。我想要做的是能够更改用户和临床医生链接到的专业 - 类似于权限管理器中角色和权限的更改方式。

我与用户和临床医生与专科之间存在多态关系。每个模型 CRUDTrait。

专业模型

public function user()
    {
        return $this->morphedByMany(User::class, 'model', 'model_has_specialties');
    }

public function clinician()
    {
        return $this->morphedByMany(Clinician::class, 'model', 'model_has_specialties');
    }

用户模型

public function specialties()
{
    return $this->morphToMany(Specialty::class, 'model', 'model_has_specialties');
}

临床医生模型

public function specialties()
{
    return $this->morphMany(Specialty::class, 'model', 'model_has_specialties');
}

数据透视表是“model_has_specialties”,包含:

$table->increments('id');
$table->timestamps();
$table->integer('model_id');
$table->string('model_type');
$table->integer('specialty_id');
$table->unique(['model_id', 'model_type', 'specialty_id']);

我尝试了许多不同的 addField() 配置,但是我真的很挣扎。

尝试过的 addField() 示例:

$this->crud->addField([
    'label' => 'specialties',
    'type' => 'select',
    'morph' => true,
    'name' => 'model_id',
    'entity' => 'ModelHasSpecialties',
    'attribute' => 'model_id',
    'model' => 'App\Models\Clinician',
    'pivot' => true,
]);

** 编辑 **

这是 ClinicianCrudController,它是临床医生类和引导程序之间的链接。

class ClinicianCrudController extends CrudController
{
    public function setup()
    {
        /*
        |--------------------------------------------------------------------------
        | CrudPanel Basic Information
        |--------------------------------------------------------------------------
        */
        $this->crud->setModel('App\Models\Clinician');
        $this->crud->setRoute(config('backpack.base.route_prefix') . '/clinician');
        $this->crud->setEntityNameStrings('clinician', 'clinicians');

        $this->crud->setColumns(['surname', 'forename', 'title', 'specialties']);

        $this->crud->addField([
            'name' => 'surname',
            'type' => 'text',
            'label' => 'Surname'
        ]);
        $this->crud->addField([
            'name' => 'forename',
            'type' => 'text',
            'label' => 'Forename'
        ]);
        $this->crud->addField([
            'name' => 'title',
            'type' => 'select_from_array',
            'options' => [
                'Dr' => 'Dr',
                'Miss' => 'Miss',
                'Mr' => 'Mr',
                'Mrs' => 'Mrs',
                '0Ms' => 'Ms',
                'Prof' => 'Prof',
            ],
            'label' => 'Title',
            'allows_null' => false,
        ]);
        $this->crud->addField([
            'label' => 'specialties',
            'type' => 'select',
            'morph' => true,
            'name' => 'model_id',
            'entity' => 'ModelHasSpecialties',
            'attribute' => 'model_id',
            'model' => 'App\Models\Clinician',
            'pivot' => true,
        ]);


        /*
        |--------------------------------------------------------------------------
        | CrudPanel Configuration
        |--------------------------------------------------------------------------
        */

        // TODO: remove setFromDb() and manually define Fields and Columns
        $this->crud->setFromDb();

        // add asterisk for fields that are required in ClinicianRequest
        $this->crud->setRequiredFields(StoreRequest::class, 'create');
        $this->crud->setRequiredFields(UpdateRequest::class, 'edit');
    }

标签: laravellaravel-backpack

解决方案


推荐阅读