2017-05-25 4 views
0

J'essaie d'effectuer une sélection avec Propel qui renvoie uniquement les colonnes calculées, mais j'ai toujours d'autres colonnes sélectionnées.Sélectionnez uniquement les colonnes calculées dans Propel

Par exemple:

$criteria = new MuestraQuery(); 
$criteria->clearSelectColumns() 
    ->addAsColumn('numEspesores', 'count(distinct muestra.sal_espesor)') 

requête résultante:

SELECT muestra.sal_id, muestra.sal_regimen, 
     -- ... 
     -- (ALL FIELDS OF THE TABLE HERE...) 
     -- ... 
     count(distinct muestra.sal_espesor) AS numEspesores 
FROM muestra 

J'ai été en mesure de réduire le nombre de champs sélectionnés ne comportant qu'un champ. Par exemple, cette requête ne retourne que deux champs:

$criteria = new MuestraQuery(); 
$criteria->clearSelectColumns() 
    ->select(MuestraTableMap::COL_SAL_ID) 
    ->addAsColumn('numEspesores', 'count(distinct muestra.sal_espesor)') 

requête résultante:

SELECT count(distinct muestra.sal_espesor) AS numEspesores, 
     muestra.sal_id AS "muestra.sal_id" 
FROM muestra 

¿Est-il un moyen Propel pour sélectionner uniquement les colonnes calculées?

J'ai vu des colonnes sont ajoutées à ModelCriteria->doSelect() sur la base protégée ModelCriteria->isSelfSelected propriété, qui est situé dans ModelCriteria->select() mais pas dans addAsColumn() parce qu'il est de critères et il n'outrepassée dans ModelCriteria.

Je ne sais pas s'il s'agit d'un bug ou si je fais quelque chose de mal.

Répondre

1

Sélectionnez simplement la colonne calculée que vous avez ajoutée.

MuestraQuery::create() 
    ->select(['numEspesores']) 
    ->addAsColumn('numEspesores', 'count(distinct muestra.sal_espesor)') 
    ->find(); 

En raison de api couramment Propel, vous ne devez pas appeler la méthode select avant la méthode addAsColumn, vous pouvez donc même faire ce qui suit:

MuestraQuery::create() 
    ->addAsColumn('numEspesores', 'count(distinct muestra.sal_espesor)') 
    ->select(['numEsesores']) 
    ->find();