Я думаю, это из-за разницы типов данных между столбцом и значением.
// [1, 2, 3] Incase of integers or decimal or double etc
->whereJsonContains('service_id', $r->service_id) // Works.
->whereJsonContains('service_id', '$r->service_id') // Doesn't work.
// ["1", "2", "3"] Incase of string or varchar
->whereJsonContains('service_id', '$r->service_id') // Works.
->whereJsonContains('service_id', $r->service_id) // Doesn't work.
Надеюсь, это поможет.