Pomocí zpětného volání můžete vytvořit složitější spojovací dotaz.
->leftJoin(TBL_CAT, function($query){
$query->on(TBL_CAT.'id', '=', 'p.cat_id')->where("**", "**", "**");
})
Zde je odkaz na laravel doc - https://laravel.com/docs/5.4/queries# se připojí Sekce "Advanced Join Clauses".
UPD::Jak je uvedeno v komentáři, není dobrý nápad mít řetězec pro takové typy dat. Hledání příčiny podle rovnosti by mělo být mnohem jednodušší než kontrola řetězce. I když by vaše množství dat nemělo mít velký rozdíl, nikdy nevíte, co se s vaší aplikací v budoucnu stane.
Ale pokud to přesto chcete udělat, myslím, že to můžete zkusit takto
->leftJoin(TBL_CAT, function($query){
$query->where(DB::raw("FIND_IN_SET(".TBL_CAT.".id, p.cat_id)"), "<>", "0");
})
Připojte se, což zkontroluje existenci id v cat_id.