我创建了 RoleEnum 并将其投射到用户模型中。被转换为 RoleEnum 的 role_id 也与角色模型有关系。
<?php
namespace App\Enums;
enum RoleEnum:int
{
case SYSTEM_ADMINISTRATOR = 1;
case ADMINISTRATOR = 2;
case SAMPLE_ROLE_ONE = 3;
case SAMPLE_ROLE_TWO = 4;
case SAMPLE_ROLE_THREE = 5;
case SAMPLE_ROLE_FOUR = 6;
}
用户模型
protected $casts = [
'email_verified_at' => 'datetime',
'password' => 'hashed',
'role_id' => RoleEnum::class,
];
public function role(): BelongsTo
{
return $this->belongsTo(Role::class);
}
在我的控制器索引中
$users = User::with('role')
->paginate()
->withQueryString();
我收到此错误,它指向 paginate()。它必须使用类而不是值。
Object of class App\Enums\RoleEnum could not be converted to string
编辑:经过进一步测试,我发现该错误是由急切加载角色(Enum 强制转换列)引起的,而不是由 paginate() 引起的。我可以简单地删除枚举铸造,一切都会正常工作。但是有没有一种方法可以在转换 Enum 的同时仍然使用预加载?
我建议您创建一个角色表,其中包含字段 id、name、slug、level 迁移应该如下所示
public function up(): void
{
Schema::create('roles', function (Blueprint $table) {
$table->id();
$table->string('slug')->unique();
$table->string('name');
$table->unsignedTinyInteger('level');
$table->timestamps();
$table->softDeletes();
});
}
和用户表
public function up(): void
{
Schema::create('users', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedTinyInteger('role_id')->index();
$table->string('username')->unique();
$table->string('email')->unique();
$table->timestamp('email_verified_at')->nullable();
$table->string('password');
$table->rememberToken();
$table->timestamps();
$table->softDeletes();
});
}
您可以自由地个性化一切
然后,必须根据您的需要来管理模型上的关系,在这些示例中,用户只有一个角色,我设置级别字段以便稍后能够对您的角色进行优先级排序。
在角色模型中,放置这些线
public function users(){
return $this->hasMany(User::class);
}
在用户模型中,放置这些行
public function role(){
return $this->belongsTo(Role::class);
}
那么你可以做
$users = User::with('role')
->paginate(10)
->withQueryString();