Через Many-to-Many, забыв про json
class User implements UserInterface
{
// ....
#[ORM\ManyToMany(targetEntity: Role::class)]
#[ORM\JoinTable(name: 'user_roles')]
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'user_id')]
#[ORM\InverseJoinColumn(name: 'role_id', referencedColumnName: 'role_id')]
private Collection $roles;
public function getRoles(): array
{
return $this->roles->map(fn ($role) => $role->getName())->toArray();
}
// ....
}
Если нужно оставить json, то вы уж сами, посредством логики создания пользователей определяйте, откуда брать список допустимых ролей. Но при этом о связи по ключам можете забыть