Add "when()" method to QueryBuilder to be more readable conditional query #7342

Open
opened 2026-01-22 15:50:18 +01:00 by admin · 0 comments
Owner

Originally created by @iku12phycho on GitHub (Mar 12, 2024).

Feature Request

Hello,
Code visibility is good if Query Builder is more Declarative.

Q A
New Feature yes
RFC no
BC Break no

Summary

add when()method to contain condition statements.
nests and if statements are less.

when()method has follow arguments

  • $condition (boolean)
  • $truthy (Closure) run if $condition is true
  • $falsy(Closure|null) run if $condition is false. when it is null, skip.

before

// switch null clause
if ($label === null) {
  $queryBuilder->where(`label is :label`)
    ->setParameter( 'label', $label);
}else {
  $queryBuilder->where(`label = :label`)
    ->setParameter( 'label', $label);
}
// conditional clause
if (!$isAdmin) {
  $queryBuilder->addWhere('isPublic = true');
}

after

$queryBuilder->when(
  condition: $label === null,
  truthy: fn ($queryBuilder) => $queryBuilder->where(`label is :label`),
  falsy: fn ($queryBuilder) => $queryBuilder->where(`label = :label`)
)
->setParameter( 'label', $label)
->when(!$isAdmin, fn ($queryBuilder) => $queryBuilder->addWhere('isPublic = true'))
;
Originally created by @iku12phycho on GitHub (Mar 12, 2024). ### Feature Request Hello, Code visibility is good if Query Builder is more Declarative. | Q | A |------------ | ------ | New Feature | yes | RFC | no | BC Break | no #### Summary add `when()`method to contain condition statements. nests and if statements are less. `when()`method has follow arguments - $condition (boolean) - $truthy (Closure) run if $condition is true - $falsy(Closure|null) run if $condition is false. when it is null, skip. before ``` // switch null clause if ($label === null) { $queryBuilder->where(`label is :label`) ->setParameter( 'label', $label); }else { $queryBuilder->where(`label = :label`) ->setParameter( 'label', $label); } // conditional clause if (!$isAdmin) { $queryBuilder->addWhere('isPublic = true'); } ``` after ``` $queryBuilder->when( condition: $label === null, truthy: fn ($queryBuilder) => $queryBuilder->where(`label is :label`), falsy: fn ($queryBuilder) => $queryBuilder->where(`label = :label`) ) ->setParameter( 'label', $label) ->when(!$isAdmin, fn ($queryBuilder) => $queryBuilder->addWhere('isPublic = true')) ; ```
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: doctrine/archived-orm#7342