Расширение ролевой модели Spatie, но использование другой таблицы базы данных - PullRequest
0 голосов
/ 26 сентября 2019

Что мне нужно сделать, так это расширить все функциональные возможности ролевой модели пакета разрешений Spatie, но использовать другую таблицу для производной модели.

Прямо сейчас у меня есть модель SubscriptionPackage, для которой я хочу эмулировать поведение роли таким образом, чтобы ей могли быть назначены разрешения, и, в свою очередь, эта модель может быть назначена пользователям.Но я хочу сохранить и ролевую модель без изменений.

Я пытался расширить Да, но когда я создаю новый SubscriptionPackage, новая запись создается в таблицах ролей вместо таблицы subscription_packages, несмотря на указание таблицы в моем производномМодель.Как показано ниже

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use App\Models\Permission; // This extends from Spatie\Permission\Models\Permission
use Spatie\Permission\Models\Role as SpatieRole;



class SubscriptionPackage extends SpatieRole
{
    //
    protected $guarded = ['id'];

    protected $table = 'subscription_packages';


    /**
     * The permissions that belong to the package.
     */
    public function packagePermissions()
    {
        return $this->belongsToMany(Permission::class);
    }

}

С кодом выше, я ожидаю, когда я создаю новый SubscriptionPackage, запись должна быть вставлена ​​в таблицу subscription_packages, но в этом случае она идет в таблицу ролей.Любые указания о том, как это сделать, будут высоко оценены.

Ответы [ 2 ]

1 голос
/ 26 сентября 2019

Если вы посмотрите на исходный код Role, вы это сделаете в методе __construct:

public function __construct(array $attributes = [])
    {
        $attributes['guard_name'] = $attributes['guard_name'] ?? config('auth.defaults.guard');
        parent::__construct($attributes);
        $this->setTable(config('permission.table_names.roles')); // <-- HERE IS THE PROBLEM!
    }

Итак, если вы хотите, чтобы ваш SubscriptionPackageчтобы записать свои записи в нужную таблицу, вы должны переопределить это поведение следующим образом:

public function __construct(array $attributes = [])
    {
        parent::__construct($attributes)

        $this->setTable('your_table_name'); // <-- HERE THE SOLUTION!
    }
0 голосов
/ 26 сентября 2019

Не думаю, что ты можешь.У Spatie уже есть 5 таблиц, и они получают данные только из них.Но все же, если вы хотите внести изменения, то внесите изменения с именем таблицы и столбца в модели

...