Как развернуть отношения в опорной точке трех моделей в laravel?

Я разрабатываю роль и разрешения на основе структуры laravel.

У меня 3 модели:

Weblog
User
Permissions

это сводная таблица

user_id , weblog_id , permission_id

Теперь у пользователя может быть блог с идентификатором разрешения 1,2 и другой блог с разрешением 1,2,3,4.

Как я могу развернуть отношения? и как я могу проверить права пользователя при управлении блогом. (промежуточное ПО и ...)

Я могу ошибаться, но я думаю, что лучше всего рассматривать сводную таблицу как модель. Таким образом, вы можете определить отношения 1:n между этими моделями.

Sindhara 13.12.2020 10:23

Является ли связь между пользователем и веб-журналом «один-ко-многим» или «многие-ко-многим» — означает, может ли одна запись веб-журнала быть связана с несколькими пользователями или одна запись веб-журнала связана только с одним пользователем.

Donkarnash 13.12.2020 10:44

Отношение @Donkarnash между веб-журналом и пользователем — «многие ко многим».

M Mehdizadeh 13.12.2020 10:46

какой код вы используете?

skibee 13.12.2020 10:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
103
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

С тем фактом, что Разрешение специфично для Веблога

Скажем, сводная таблица называется permission_user_weblog

class User extends Model
{
    public function weblogs()
    {
        return $this->belongsToMany(Weblog::class, 'permission_user_weblog');
    }

    public function permissionsFor(int $weblogId)
    {
        $permissionIds = null;

        $this->weblogs()
            ->where('id', $weblogId)
            ->with('permissions')
            ->get()
            ->each(function($weblog) use(&$permissionIds) {
                $permissionIds = $weblog->permissions->pluck('id');             
            });

        return $permissionIds;
    }
}


class Weblog extends Model
{
    public function users()
    {
        return $this->belongsToMany(User::class, 'permission_user_weblog');
    }

    public function permissions()
    {
        return $this->belongsToMany(Permission::class, 'permission_user_weblog');
    }
}


class Permission extends Model
{
    public function weblogs()
    {
        return $this->belongsToMany(Weblog::class, 'permission_user_weblog');
    }
}

Затем вы можете проверить в любом месте, есть ли у вошедшего в систему пользователя определенное разрешение для определенного блога.

public function update(Request $request, $weblogId)
{
    $user = auth()->user();
    $permissions = $user->permissionsFor($weblogId);

    //Check whether the logged in user has permission identified by id 1 or 4 for weblog
    $can = !! $permissions->intersect([1,4])->count();

    //Do rest of processing
}

спасибо за это решение, я работаю над этим, и я обновлю здесь.

M Mehdizadeh 13.12.2020 17:27

ваш блог, пользователь, разрешение имеет отношение ManyToMany, это немного странно, но если вы хотите иметь такое отношение, это не проблема.

просто рассмотрите каждую пару как ManyToMany. и каждый из них также может иметь hasMany для Pivot (я назвал его Access) (в зависимости от ваших потребностей).

Пользовательская модель:

class User extends Model{

/**
      * retrive weblogs
      *
      * @return BelongsToMany weblogs
      */
     public function weblogs()
     {
         return $this->belongsToMany(App\WebLog::class,'accesses_table')
                        ->withPivot("permission_id")
                        ->using(App\Access::class);
     }

/**
      * retrive permissions
      *
      * @return BelongsToMany permissions
      */
     public function permissions()
     {
         return $this->belongsToMany(App\Permission::class,'accesses_table')
                        ->withPivot("weblog_id")
                        ->using(App\Access::class);
     }

/**
      * retrive access
      *
      * @return hasMany [description]
      */
     public function accesses()
     {
         return $this->hasMany(App\Access::class, "user_id");
     }
}

Модель блога:

class Weblog extends Model{

/**
      * retrive users
      *
      * @return BelongsToMany users
      */
     public function users()
     {
         return $this->belongsToMany(App\User::class,'accesses_table')
                        ->withPivot("permission_id")
                        ->using(App\Access::class);
     }

/**
      * retrive permissions
      *
      * @return BelongsToMany permissions
      */
     public function permissions()
     {
         return $this->belongsToMany(App\Permission::class,'accesses_table')
                        ->withPivot("user_id")
                        ->using(App\Access::class);
     }

/**
      * retrive access
      *
      * @return hasMany [description]
      */
     public function accesses()
     {
         return $this->hasMany(App\Access::class, "weblog_id");
     }
}

Модель разрешения:

class Permission extends Model{

/**
      * retrieve users
      *
      * @return BelongsToMany users
      */
     public function users()
     {
         return $this->belongsToMany(App\User::class,'accesses_table')
                        ->withPivot("weblog_id")
                        ->using(App\Access::class);
     }

/**
      * retrieve weblogs
      *
      * @return BelongsToMany weblogs
      */
     public function weblogs()
     {
         return $this->belongsToMany(App\Weblog::class,'accesses_table')
                        ->withPivot("user_id")
                        ->using(App\Access::class);
     }

/**
      * retrive access
      *
      * @return hasMany [description]
      */
     public function accesses()
     {
         return $this->hasMany(App\Access::class, "permission_id");
     }
}

и у вас может быть модель для вашего свода, которую я назвал Access:

Illuminate\Database\Eloquent\Relations\Pivot;

class Access extends Pivot
{

    public $incrementing = true;

public function user()
    {
        return $this->belongsTo(App\User::class);
    }

    public function weblog()
    {
        return $this->belongsTo(App\Weblog::class);
    }

    public function permission()
    {
        return $this->belongsTo(App\Permission::class);
    }

}

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