laravel-whererelation-replace-wherehas-tip.png
Шаблон кодуLaravel

Laravel whereRelation(): замість зайвого whereHas()

Коли для зв’язку потрібна одна проста умова, whereRelation() прибирає зайвий callback у whereHas() і залишає той самий намір запиту більш виразним.

Для простої умови на пов'язаній моделі whereHas() часто додає більше ceremony, ніж самої логіки.

Якщо потрібно перевірити існування зв'язку з однією звичайною умовою, whereRelation() дозволяє записати той самий намір коротше і виразніше.

Замість callback у whereHas()

До
php
Post::query()    ->whereHas(        'author',        fn ($query) =>            $query->where('active', true),    )    ->get();
Після
php
Post::query()    ->whereRelation(        'author',        'active',        true,    )    ->get();

У цьому випадку callback не додає окремої складної логіки. Він лише передає одну умову в relationship query, тому whereRelation() краще показує, що саме перевіряється.

Сенс залишається тим самим: отримати тільки ті Post, для яких існує пов'язаний author, що відповідає умові.

Можна передавати оператор

PHP - whereRelation() з оператором
Post::query()    ->whereRelation(        'author',        'rating',        '>=',        4,    )    ->get();

Форма дуже схожа на звичайний where(): relation, column, operator і value. Для рівності оператор можна не передавати окремо.

Коли whereHas() все ще кращий

PHP - whereHas() для кількох умов
Post::query()    ->whereHas(        'author',        fn ($query) => $query            ->where('active', true)            ->where('verified', true)            ->whereNotNull('email_verified_at'),    )    ->get();
whereRelation() найкраще підходить для короткої inline-умови. Якщо callback містить кілька умов, grouping або складнішу relationship logic, whereHas() зазвичай залишається читабельнішим.

Правило просте: не замінювати whereHas() механічно. Якщо callback існує лише заради одного where(), перевірте, чи whereRelation() не виражає той самий намір точніше.

#eloquent #laravel-12 #laravel-13 #php-8-4 #php-8-5 #where-relation #where-has #relationship-queries

Схожі поради

laravel-withwherehas-avoid-duplicate-conditions-tip.pngПорада
Переглянути пораду
#eloquent #laravel-12 #laravel-13 #php-8-4 #php-8-5 #where-has #with-where-has #eager-loading #relationships
laravel-tap-side-effects-keep-original-value-tip.pngПорада
Переглянути пораду
#eloquent #laravel-12 #laravel-13 #php-8-4 #php-8-5 #tap #helpers #tappable
laravel-firstorcreate-replace-first-create-tip.pngПорада
Переглянути пораду
#eloquent #laravel-12 #laravel-13 #php-8-4 #php-8-5 #model-persistence #first-or-create #first-or-new
laravel-updateorcreate-replace-first-if-tip.pngПорада
Переглянути пораду
#eloquent #laravel-12 #laravel-13 #php-8-4 #php-8-5 #update-or-create #model-persistence #upsert