从枚举类型转换列中预加载关系会返回错误

问题描述 投票:0回答:1

我创建了 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 的同时仍然使用预加载?

laravel enums eager-loading
1个回答
0
投票

我建议您创建一个角色表,其中包含字段 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();
© www.soinside.com 2019 - 2024. All rights reserved.