71 lines
1.9 KiB
PHP
71 lines
1.9 KiB
PHP
<?php
|
||
|
||
namespace App\Models;
|
||
|
||
use CodeIgniter\Model;
|
||
|
||
class RoleModel extends Model
|
||
{
|
||
protected $table = 'roles';
|
||
protected $primaryKey = 'id';
|
||
protected $allowedFields = [
|
||
'name',
|
||
'slug',
|
||
'description',
|
||
'dashboard_route',
|
||
'priority',
|
||
'is_active',
|
||
'created_at',
|
||
'updated_at'
|
||
];
|
||
|
||
protected $useTimestamps = true;
|
||
protected $createdField = 'created_at';
|
||
protected $updatedField = 'updated_at';
|
||
|
||
public function findByNamesOrSlugs(array $keys): array
|
||
{
|
||
if (empty($keys)) return [];
|
||
|
||
// Normalize for case-insensitive matching
|
||
$lower = array_map('strtolower', $keys);
|
||
|
||
// We’ll match on lower(name) or lower(slug)
|
||
return $this->where('is_active', 1)
|
||
->groupStart()
|
||
->whereIn('LOWER(name)', $lower)
|
||
->orWhereIn('LOWER(slug)', $lower)
|
||
->groupEnd()
|
||
->orderBy('priority', 'ASC') // highest priority first
|
||
->findAll();
|
||
}
|
||
|
||
public function getRouteByNameOrSlug(string $key): ?string
|
||
{
|
||
$row = $this->where('is_active', 1)
|
||
->groupStart()
|
||
->where('LOWER(name)', strtolower($key))
|
||
->orWhere('LOWER(slug)', strtolower($key))
|
||
->groupEnd()
|
||
->first();
|
||
|
||
return $row['dashboard_route'] ?? null;
|
||
}
|
||
|
||
public function getRoles()
|
||
{
|
||
return $this->findAll();
|
||
}
|
||
|
||
/** Map role names -> role IDs */
|
||
public function getIdsByNames(array $names): array
|
||
{
|
||
$names = array_values(array_filter(array_map('strval', $names)));
|
||
if (empty($names)) return [];
|
||
|
||
// collation is usually case-insensitive; if not, add LOWER() both sides
|
||
$ids = $this->select('id')->whereIn('name', $names)->findColumn('id');
|
||
return array_map('intval', $ids ?? []);
|
||
}
|
||
}
|