Чтобы не городить кучу методов для выборки на каждый случай жизни, я бы сделал скоуп, который принимал бы пользователя в качестве аргумента и фильтровал записи в зависимости от пермишенов. Тогда выборка контрактов всегда будет "чистой", типа
Contract::withPermission($user)->get();
В скоупе уже придется прописать фильтры по пермишенам.
Да, может это и не бест практис, но ведь работает. Теоретически, конечно, такого не приходилось реализовывать еще.