
Laravel whereRelation(): замість зайвого whereHas()
Коли для зв’язку потрібна одна проста умова, whereRelation() прибирає зайвий callback у whereHas() і залишає той самий намір запиту більш виразним.
Для простої умови на пов'язаній моделі whereHas() часто додає більше ceremony, ніж самої логіки.
Якщо потрібно перевірити існування зв'язку з однією звичайною умовою, whereRelation() дозволяє записати той самий намір коротше і виразніше.
Замість callback у whereHas()
Post::query() ->whereHas( 'author', fn ($query) => $query->where('active', true), ) ->get();Post::query() ->whereRelation( 'author', 'active', true, ) ->get();У цьому випадку callback не додає окремої складної логіки. Він лише передає одну умову в relationship query, тому whereRelation() краще показує, що саме перевіряється.
Сенс залишається тим самим: отримати тільки ті Post, для яких існує пов'язаний author, що відповідає умові.
Можна передавати оператор
Post::query() ->whereRelation( 'author', 'rating', '>=', 4, ) ->get();Форма дуже схожа на звичайний where(): relation, column, operator і value. Для рівності оператор можна не передавати окремо.
Коли whereHas() все ще кращий
Post::query() ->whereHas( 'author', fn ($query) => $query ->where('active', true) ->where('verified', true) ->whereNotNull('email_verified_at'), ) ->get();Правило просте: не замінювати whereHas() механічно. Якщо callback існує лише заради одного where(), перевірте, чи whereRelation() не виражає той самий намір точніше.




