Можно ли создать морфированное отношение многие-ко-многим на той же модели в Laravel? (Два морфированных отношения находятся в одной модели)
У меня есть модели Role и DocType с таблицами. Типы документов должны быть утверждены конкретными ролями и созданы другими конкретными ролями. Вот структура таблиц:
Roles
id | name
DocTypes
id | name | author_id | approved
docTypes_roles_table
doc_type_id | role_id| role_type
Вот мой код:
в классе AppServiceProvider:
public function boot() {
Schema::defaultStringLength(191);
Relation::morphMap([
'approve' => 'App\Models\Role',
'create' => 'App\Models\Role',
]);
}
в ролевом классе
public function docTypes() {
return $this->morphToMany('App\Models\DocType', 'role','doc_type_role');
}
в классе DocType
/**
* Get the polymorphic relation with roles table
*
* @return \Illuminate\Database\Eloquent\Relations\MorphToMany
*/
public function roles() {
return $this->morphedByMany('App\Models\Role', 'role','doc_type_role')->withPivot('role_type');
}
/**
* Get roles which must approve the docType
*
* @return \Illuminate\Database\Eloquent\Relations\MorphToMany
*/
public function approveRoles() {
return $this->roles()->wherePivot('role_type','approve')->withPivot('sequence')->orderBy('sequence');
}
/**
* Get roles which create the docType
*
* @return \Illuminate\Database\Eloquent\Relations\MorphToMany
*/
public function createRoles() {
return $this->roles()->wherePivot('role_type','create');
}
Но когда я прикрепляю роли к createRoles()
он сохраняет в базе данных тип утверждения.
$trip = User::find(1)->docTypes()->create([
"name" => "business_trip",
"display_name" => "Business Trip",
]);
$trip->approveRoles()->sync([
2 => ['sequence' => 1],
]);
$trip->createRoles()->attach([5,3]);
1 ответ
Решение
Я сделал это, расширив класс Role до другого класса CreatorRole. Но теперь, если мне нужна такая вещь, я добавляю еще один столбец (например, "тип") в сводную таблицу и выполняю прикрепление по этому значению сводной таблицы.