File "Roles.php"

Full Path: /home/pulsehostuk9/public_html/invoicer.pulsehost.co.uk/vendor/silber/bouncer/src/Roles.php
File size: 2.53 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace Silber\Bouncer\Database\Queries;

use Silber\Bouncer\Database\Models;
use Silber\Bouncer\Helpers;

class Roles
{
    /**
     * Constrain the given query by the provided role.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  string  ...$roles
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function constrainWhereIs($query, ...$roles)
    {
        return $query->whereHas('roles', function ($query) use ($roles) {
            $query->whereIn('name', $roles);
        });
    }

    /**
     * Constrain the given query by all provided roles.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  string  ...$roles
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function constrainWhereIsAll($query, ...$roles)
    {
        return $query->whereHas('roles', function ($query) use ($roles) {
            $query->whereIn('name', $roles);
        }, '=', count($roles));
    }

    /**
     * Constrain the given query by the provided role.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  string  ...$roles
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function constrainWhereIsNot($query, ...$roles)
    {
        return $query->whereDoesntHave('roles', function ($query) use ($roles) {
            $query->whereIn('name', $roles);
        });
    }

    /**
     * Constrain the given roles query to those that were assigned to the given authorities.
     *
     * @param  \Illuminate\Database\Eloquent\Builder  $query
     * @param  string|\Illuminate\Database\Eloquent\Model|\Illuminate\Database\Eloquent\Collection  $model
     * @return void
     */
    public function constrainWhereAssignedTo($query, $model, ?array $keys = null)
    {
        [$model, $keys] = Helpers::extractModelAndKeys($model, $keys);

        $query->whereExists(function ($query) use ($model, $keys) {
            $table = $model->getTable();
            $key = "{$table}.{$model->getKeyName()}";
            $pivot = Models::table('assigned_roles');
            $roles = Models::table('roles');

            $query->from($table)
                ->join($pivot, $key, '=', $pivot.'.entity_id')
                ->whereColumn("{$pivot}.role_id", "{$roles}.id")
                ->where("{$pivot}.entity_type", $model->getMorphClass())
                ->whereIn($key, $keys);

            Models::scope()->applyToModelQuery($query, $roles);
            Models::scope()->applyToRelationQuery($query, $pivot);
        });
    }
}