2012-08-08 1 views
7

prima di tutto, è quello che sto cercando di fare:Zend: Seleziona oggetto: come sostituire le colonne selezionate impostate da()?

In una delle mie classi nella libreria voglio contare la quantità totale di righe di un risultato di ricerca. La classe utilizza un oggetto selezionato impostato dal modello di appendice del risultato della ricerca. Il mio problema è ora, questo select() ha già impostato le colonne richieste da(), ma per contare semplicemente le righe voglio solo selezionare l'id, perché il sito web deve essere performante. Non posso semplicemente cambiare i valori dell'oggetto, perché lo sto usando nella libreria e le variabili sono protette. Sfortunatamente, Zend non ha alcuna funzione per il comando mySql count e non voglio usare il codice mySql statico, perché potrebbe essere, che cambieremo il nostro sistema di database in futuro.

Ora ecco la mia domanda:

C'è qualche possibilità per Zend_Select come avrei potuto cambiare le colonne selezionate?

risposta

15

Prova questa:

$select->reset(Zend_Db_Select::COLUMNS) 
     ->from('thetable', 'COUNT(*)'); 

sostituendo il 'thetable' con il nome della tabella corretta.

+0

Ho dovuto rimuovere anche la costante FROM, ma questo è esattamente quello che stavo cercando, grazie mille! – StoryTeller

+0

Ho alcuni "inner joins" nella mia query e dopo aver ripristinato le COLONNE , aggiunge automaticamente un "Inner join" con la tabella FROM! Che cosa sto facendo male? –

1

Questo proviene da un progetto e non è testato, ma uno di questi dovrebbe funzionare.

$select->from(array("table_name" => "table_name"), array("my_col" => "COUNT(id)")); 

O

$select->from(array("table_name"), array("my_col" => "COUNT(id)")); 

Questa è la stessa

SELECT COUNT(id) as my_col FROM table_name 

Speranza che aiuta

Jake

+0

Purtroppo, ottengo un'eccezione: non è possibile definire una nome di correlazione 'bd_users' più di una volta – StoryTeller

+0

È possibile passare un array vuoto come primo parametro, poiché non è necessario aggiungere nuovamente la tabella. In questo modo non tenterà di ri-dichiarare la correlazione. – Eric

-1

Per utilizzare un il comando mysql in una selezione, è necessario utilizzare Zend_Db_Expr:

$select = $this->select() 
      ->from('myTable', new Zend_Db_Expr('COUNT(id) as count')); 
echo $select; //SELECT COUNT(id) as count FROM myTable; 
+0

Non sono in un modello e non riesco a scrivere questo codice all'interno di un modello. Si prega di leggere la domanda. – StoryTeller

+1

Se si desidera utilizzare il conteggio, il modo corretto dovrebbe essere '('myTable', array ('count' => new Zend_Db_Expr ('count (*)'))' (o ID invece di * se necessario). – Seti

1

Questo non ha funzionato per me (avevo bisogno di selezionare solo da una tabella unite):

$select->reset(Zend_Db_Select::COLUMNS) 
    ->from('thetable', 'COUNT(*)'); 

Forse perché ho avuto qualche join. Ma comunque, ecco la soluzione: utilizzare reset() e poi le colonne():

$select->setIntegrityCheck(false) 
     ->from(['t1' => 'table1']) 
     ->join(['t2' => 't2'], 't1.id = t2.t1_id') 
     ->reset(Zend_Db_Select::COLUMNS) 
     ->columns('t1.*'); 

Cordiali saluti, la versione di Zend Framework è 1.12