Луди реквизити към @Dave Redfern в Slack, който посочи проблема ми. При предаване на ненулев индексиран масив, той се интерпретира като обект.
dump(json_encode([
0 => "ROLE_SITE_DIRECTOR", 2 => "ROLE_TRANSLATOR", 1 => "ROLE_DATA_ENTRY",
]));
dump(json_encode(array_values([
0 => "ROLE_SITE_DIRECTOR", 2 => "ROLE_TRANSLATOR", 1 => "ROLE_DATA_ENTRY",
])));
изходът ще бъде:
"{"0":"ROLE_SITE_DIRECTOR","2":"ROLE_TRANSLATOR","1":"ROLE_DATA_ENTRY"}"
"["ROLE_SITE_DIRECTOR","ROLE_TRANSLATOR","ROLE_DATA_ENTRY"]"
Така че поправката е проста, аз съм моят сетер:
$this->roles = array_values($roles);
Продължавайки напред, също така е по-добра практика да използвате релации на базата данни към ролите. Търсенето по JSON данни не е забавно, но при свързване е стандартна практика.