U kunt terugbellen gebruiken om meer gecompliceerde join-query's te maken.
->leftJoin(TBL_CAT, function($query){
$query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**");
})
Hier is een link op laravel doc - https://laravel.com/docs/5.4/queries# doet mee "Geavanceerde lidmaatschapsclausules" sectie.
UPD::Zoals vermeld in de opmerking, is het geen goed idee om een string te hebben voor dergelijke soorten gegevens. Oorzaak zoeken op gelijkheid zou veel eenvoudiger moeten zijn dan stringcontrole. Zelfs als uw hoeveelheid gegevens niet veel zou moeten verschillen, weet u nooit wat er in de toekomst met uw app zal gebeuren.
Maar als je dat nog steeds wilt doen, denk ik dat je het zo kunt proberen
->leftJoin(TBL_CAT, function($query){
$query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})
Join die het bestaan van id in cat_id zal controleren.