Du kan använda återuppringning för att skapa en mer komplicerad kopplingsfråga.
->leftJoin(TBL_CAT, function($query){
$query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**");
})
Här är länken på laravel doc - https://laravel.com/docs/5.4/queries# går med Avsnittet "Avancerade anslutningsklausuler".
UPD::Som nämnts i kommentaren är det inte bra att ha en sträng för sådana typer av data. Orsakssökning efter likhet borde vara mycket enklare än strängkontroll. Även om din mängd data inte skulle ha stor skillnad, vet du aldrig vad som kommer att hända med din app i framtiden.
Men om du fortfarande vill göra det tror jag att du kan prova så här
->leftJoin(TBL_CAT, function($query){
$query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})
Gå med som kommer att kontrollera förekomsten av id i cat_id.