2012-09-26 10 views
5

Io davvero non capisco il punto di come utilizzare predicati in Zend Framework 2.ZF2 Zend Db Sql Sql utilizzando predicato nella condizione WHERE

questo è quello che ho ottenuto:

$sql->select() 
     ->columns(array('GroupedColum' 
      ,'minValue' => new Expression('min(ValueColumn)'))) 
     ->from('ValueTable') 
     ->group('GroupedColum') 
     ->order('minValue') 
     ->order('GroupedColum') 
     ->limit(10); 

questo sta lavorando bene

ora voglio applicare qualcosa di simile:

$predicate = new Zend\Db\Sql\Predicate\Predicate(); 
$sql->where($predicate->greaterThan('filterColumn','20); 

questo è quello che ho provato, ma non getta alcuna er ror, ma non funziona :-(

Questo è quello che mi aspetto come SQL:

select GroupedColum 
    , min(ValueColumn) as minValue 
from ValueTable 
where filterColumn > 20 
group by GroupedColum 
order by minValue 
    GroupedColum 
limit 10; 
+0

si dovrebbe aggiungere la vostra soluzione come risposta. – Xerkus

+0

fatto, grazie per il consiglio! – RomanKonz

risposta

9

Ho risolto il problema visualizzando il codice sorgente di zf2

Se sai come per farlo, è davvero facile, il codice sopra era quasi corretto!

Invece di

$predicate = new Zend\Db\Sql\Predicate\Predicate(); 

è necessario utilizzare

$predicate = new \Zend\Db\Sql\Where(); 

è una classe derivata vuoto, che viene utilizzato in Zend \ Db \ Sql \ Sql

questo è il Esempio operativo completo:

$sql->select() 
    ->columns(array('GroupedColum' 
     ,'minValue' => new Expression('min(ValueColumn)'))) 
    ->from('ValueTable') 
    ->group('GroupedColum') 
    ->order('minValue') 
    ->order('GroupedColum') 
    ->limit(10); 
$predicate = new \Zend\Db\Sql\Where(); 
$sql->where($predicate->greaterThan('filterColumn','20')); 
6

Un po 'in ritardo, ma è anche possibile ottenere questo risultato facendo

$sql->select() 
->columns(array('GroupedColum' 
    ,'minValue' => new Expression('min(ValueColumn)'))) 
->from('ValueTable') 
->group('GroupedColum') 
->order('minValue') 
->order('GroupedColum') 
->limit(10) 
->where 
    ->greaterThan('filterColumn', '20'); 

Il metodo magico __get di \ Zend \ Db \ Sql \ Select ha un caso per cui che restituisce il predicato attuale, in cui(), che permette di fare cose più complesse come ad esempio

$sql->where 
    ->greaterThan('filterColumn', '20') 
    ->or 
    ->greaterThan('filterColumn', '30'); 

vs

$predicate = new \Zend\Db\Sql\Where(); 
$sql->where($predicate->greaterThan('filterColumn', '20')); 
$sql->where($predicate->greaterThan('filterColumn', '30'), 'OR'); 

per un elenco di tutti i predicati disponibili in ZF 2 (2.1.0) da t egli Dove predicato vedi:

+0

@Pang Aggiornamento alla versione di riferimento, si noti che ZF2 è cambiato in modo significativo dal momento della pubblicazione. – fyrye

Problemi correlati