Laravel Role HasMany отношения - PullRequest
       8

Laravel Role HasMany отношения

0 голосов
/ 28 сентября 2018

У меня есть User Model и Role Model, которые во многих отношениях.У меня две роли: администратор и менеджер.У меня также есть Order Model.Менеджеры должны иметь много заказов.Где я заявляю такие отношения?Должен ли я указать это в классе пользователя?Нужно ли создавать отдельные модели для администраторов и менеджеров?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2018

Менеджеры и администраторы - это подмножество ваших пользователей, определенных их ролями.

Поэтому мы будем использовать область действия для фильтрации пользователей, являющихся менеджерами по их ролям.

App \ Scopes \ ManagerUserScope.php

<?php

namespace App\Scopes;

use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;

class ManagerUserScope implements Scope
{
    /**
     * Apply the scope to a given Eloquent query builder.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $builder
     * @param  \Illuminate\Database\Eloquent\Model  $model
     * @return void
     */
    public function apply(Builder $builder, Model $model)
    {
        //Assuming Your user has a relationship (has many) role
        $builder->whereHas('role', function($roleQuery) {
            //Assuming that in the role table, the manager role entry has ID 1
            $roleQuery->where('id','=',1);
        });
    }
}

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

App \ Models \ Manager.php

namespace App\Models;

use App\Scopes\ManagerUserScope;

class Manager extends User {

    /**
     * The "booting" method of the model.
     *
     * @return void
     */
    protected static function boot()
    {
        parent::boot();

        static::addGlobalScope(new ManagerUserScope);
    }

    /**
    *  Relationship: Orders (Has many)
    */
    public function orders()
    {
        return $this->hasMany('orders');
    }   
}
0 голосов
/ 28 сентября 2018

Ваше отношение «многие ко многим» между User и Role может быть прекрасно описано с помощью belongsToMany Методы красноречивых отношений в обоих направлениях.Кроме того, поскольку у каждого Order должен быть ответственный менеджер, у нас также есть отношение один-ко-многим между Manager и Order, которое будет описано с помощью hasMany / belongsTo методов.

Так, ваша User модель будет иметь:

public function roles()
{
    return $this->belongsToMany('App\Role');
}

public function orders()
{
    return $this->hasMany('App\Order');
}

Для вашей Role модели:

public function users()
{
    return $this->belongsToMany('App\User');
}

И, наконец, ваша Order модель:

public function manager()
{
    return $this->belongsTo('App\User');
}

Нет необходимости создавать определенные ограничения (например, «только пользователи с диспетчером ролей могут иметь заказы») на уровне схемы БД, это легче реализовать в коде.Так, например, вы можете захотеть реализовать метод, который будет назначать заказ пользователю и сначала проверять его роли.

...