You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
3.4 KiB
150 lines
3.4 KiB
<?php
|
|
|
|
namespace App\Models;
|
|
|
|
use Dcat\Admin\Models\MenuCache;
|
|
use Dcat\Admin\Traits\HasDateTimeFormatter;
|
|
use Dcat\Admin\Traits\ModelTree;
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
use Spatie\EloquentSortable\Sortable;
|
|
|
|
class BlockControlAdminMenu extends Model implements Sortable
|
|
{
|
|
//
|
|
protected $table = 'block_control_admin_menu';
|
|
use HasDateTimeFormatter,
|
|
MenuCache,
|
|
ModelTree {
|
|
allNodes as treeAllNodes;
|
|
ModelTree::boot as treeBoot;
|
|
}
|
|
|
|
/**
|
|
* @var array
|
|
*/
|
|
protected $sortable = [
|
|
'sort_when_creating' => true,
|
|
];
|
|
|
|
/**
|
|
* The attributes that are mass assignable.
|
|
*
|
|
* @var array
|
|
*/
|
|
protected $fillable = ['parent_id', 'order', 'title', 'icon', 'uri', 'permission_id'];
|
|
|
|
/**
|
|
* Create a new Eloquent model instance.
|
|
*
|
|
* @param array $attributes
|
|
*/
|
|
public function __construct(array $attributes = [])
|
|
{
|
|
$connection = config('admin.database.connection') ?: config('database.default');
|
|
|
|
$this->setConnection($connection);
|
|
|
|
$this->setTable(config('admin.database.menu_table'));
|
|
|
|
parent::__construct($attributes);
|
|
}
|
|
|
|
/**
|
|
* A Menu belongs to many roles.
|
|
*
|
|
* @return BelongsToMany
|
|
*/
|
|
public function roles(): BelongsToMany
|
|
{
|
|
$pivotTable = config('admin.database.role_menu_table');
|
|
|
|
$relatedModel = config('admin.database.roles_model');
|
|
|
|
return $this->belongsToMany($relatedModel, $pivotTable, 'menu_id', 'role_id');
|
|
}
|
|
|
|
public function permissions(): BelongsToMany
|
|
{
|
|
$pivotTable = config('admin.database.permission_menu_table');
|
|
|
|
$relatedModel = config('admin.database.permissions_model');
|
|
|
|
return $this->belongsToMany($relatedModel, $pivotTable, 'menu_id', 'permission_id');
|
|
}
|
|
|
|
/**
|
|
* Get all elements.
|
|
*
|
|
* @param bool $force
|
|
*
|
|
* @return array
|
|
*/
|
|
public function allNodes(bool $force = false): array
|
|
{
|
|
if ($force || $this->queryCallbacks) {
|
|
return $this->fetchAll();
|
|
}
|
|
|
|
return $this->remember(function () {
|
|
return $this->fetchAll();
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Fetch all elements.
|
|
*
|
|
* @return array
|
|
*/
|
|
public function fetchAll(): array
|
|
{
|
|
return $this->withQuery(function ($query) {
|
|
if (static::withPermission()) {
|
|
$query = $query->with('permissions');
|
|
}
|
|
|
|
return $query->with('roles');
|
|
})->treeAllNodes();
|
|
}
|
|
|
|
/**
|
|
* Determine if enable menu bind permission.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function withPermission()
|
|
{
|
|
return config('admin.menu.bind_permission') && config('admin.permission.enable');
|
|
}
|
|
|
|
/**
|
|
* Determine if enable menu bind role.
|
|
*
|
|
* @return bool
|
|
*/
|
|
public static function withRole()
|
|
{
|
|
return (bool) config('admin.permission.enable');
|
|
}
|
|
|
|
/**
|
|
* Detach models from the relationship.
|
|
*
|
|
* @return void
|
|
*/
|
|
protected static function boot()
|
|
{
|
|
static::treeBoot();
|
|
|
|
static::deleting(function ($model) {
|
|
$model->roles()->detach();
|
|
$model->permissions()->detach();
|
|
|
|
$model->flushCache();
|
|
});
|
|
|
|
static::saved(function ($model) {
|
|
$model->flushCache();
|
|
});
|
|
}
|
|
}
|
|
|