Laravel背包多态CRUD领域

时间:2019-03-09 00:28:42

标签: laravel backpack-for-laravel

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

我与“用户和临床医生到专业”之间存在多态性n-n关系。每个模型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');
    }

0 个答案:

没有答案