nathanmbanza19's avatar

Call to undefined cast

I get error when trying to use App\Model\User. The error is from illuminate\Database\Eloquent\InvalidCastException.

Il get this message : Call to undefined cast [App\Models\Role] on Column [role] in model [App\Models\User]

Here is my code : protected $cast = [ 'email_verified_at' => 'datetime' , 'password' => 'hashed' , 'role' => Role::class, ];

Public function isAdmin(): bool { return $this->role == Role::Admin; }

Have an Idea ?

0 likes
3 replies
Niush's avatar

Better use PHP Enum and Enum casting: https://laravel.com/docs/10.x/eloquent-mutators#enum-casting

// Create File: app/Enum/Roles.php

<?php

namespace App\Enum;

enum Roles: string
{
    case Admin = 'admin';
    case User = 'user';
}

Then in your User Model:

use App\Enum\Roles;
// ...

protected $casts = [
    'email_verified_at' => 'datetime',
    'role' => Roles::class,
];

public function isAdmin(): bool
{
    return $this->role == Roles::Admin;
}

Then work with Enum in your code: auth()->user()->role->value or auth()->user()->role->name or auth()->user()->isAdmin() etc.

1 like
kokoshneta's avatar

@Niush Or better yet, use an integer enum, rather than a string enum, so you can use bitmasking to store multiple user roles in a single column.

// Roles class
enum Roles: int {
	case BaseUser = 1;
	case Monitor = 2;
	case Admin = 4;
	case Owner = 8;
}

---

// User class
public function isAdmin() : bool {
    return $this->role & Roles::Admin->value;
}

// Or more generally
public function isRole(Roles $role) : bool {
	return $this->role & $role->value;
}

(Note that in this scenario, you don’t actually cast the role as an enum, but keep it as an integer.)

Please or to participate in this conversation.