- Classes :
AppoloDev\SFToolboxBundle\Domain\Repository\Criteria\Expression\Select\PartialExpr,PartialDtoExpr - Fichiers source :
src/Domain/Repository/Criteria/Expression/Select/PartialExpr.php,PartialDtoExpr.php
Deux implémentations d'ExpressionInterface (voir ce fichier pour le contrat commun) dédiées à la projection partielle d'une entité dans un SELECT — c'est-à-dire ne charger que certains champs plutôt que l'entité complète, pour des raisons de performance.
PartialExpr: projection "partielle" au sens Doctrine (syntaxepartial alias.{champs}), retourne toujours une instance de l'entité, mais avec seulement les champs demandés hydratés.PartialDtoExpr: projection vers un DTO arbitraire via la syntaxeNEWde DQL (hydratation d'un objet construit explicitement).
Les deux s'utilisent avec SelectCriteria::selectExpr().
$fields: liste des noms de champs à charger.$customAlias: alias DQL à utiliser (sinon, l'alias par défaut du repository).
Génère partial <alias>.{champ1, champ2, ...}.
use AppoloDev\SFToolboxBundle\Domain\Repository\Criteria\Expression\Select\PartialExpr;
$books = $repository->getQB()
->selectExpr(new PartialExpr(['id', 'title']))
->getResults();
// Retourne des instances de Book, mais seuls id/title sont hydratés
// (les autres champs lèveront une erreur si on tente d'y accéder sans les recharger)$fields: liste des noms de champs, dans l'ordre des arguments du constructeur de$objectClass.$objectClass: FQCN de la classe DTO à instancier (doit avoir un constructeur acceptant ces champs dans cet ordre).$customAlias: alias DQL à utiliser (sinon, l'alias par défaut du repository).
Génère NEW <FQCN>(<alias>.champ1, <alias>.champ2, ...) — syntaxe DQL native permettant à Doctrine d'hydrater directement des objets non-entité.
use AppoloDev\SFToolboxBundle\Domain\Repository\Criteria\Expression\Select\PartialDtoExpr;
final class BookSummaryDto
{
public function __construct(
public readonly string $id,
public readonly string $title,
) {}
}
$summaries = $repository->getQB()
->selectExpr(new PartialDtoExpr(['id', 'title'], BookSummaryDto::class))
->getResults();
// $summaries est un tableau de BookSummaryDto, pas de BookPartialExpr: besoin de rester sur des instances de l'entité (ex: passer le résultat à du code qui attendBook), tout en limitant les colonnes chargées.PartialDtoExpr: besoin d'un objet de lecture dédié (ex: API, export), sans risque d'accéder par erreur à un champ non chargé.
- Expression — le contrat
ExpressionInterfacecommun. - SelectCriteria::selectExpr() — point d'utilisation.