Gekke rekwisieten voor @Dave Redfern op Slack die op mijn probleem wees. Bij het passeren van een niet-nul geïndexeerde array, wordt deze geïnterpreteerd als een object.
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",
])));
output zal zijn:
"{"0":"ROLE_SITE_DIRECTOR","2":"ROLE_TRANSLATOR","1":"ROLE_DATA_ENTRY"}"
"["ROLE_SITE_DIRECTOR","ROLE_TRANSLATOR","ROLE_DATA_ENTRY"]"
Dus de oplossing is eenvoudig, ik ben mijn zetter:
$this->roles = array_values($roles);
In de toekomst is het ook een betere gewoonte om databaserelaties met de rollen te gebruiken. Zoeken op JSON-gegevens is niet leuk, maar in een join is de standaardpraktijk.