2012-09-26 12 views
5

I naprawdę nie dostać punkt, jak używać predykatów w Zend Framework 2.ZF2 Zend Db SQL SQL przy użyciu predykatu w którym warunek

to, co mam:

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

to działa dobrze

teraz chcę zastosować coś takiego:

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

to co próbowałem, to nie rzuca er ror, ale to nie działa :-(

To jest to, czego oczekuję jak SQL:

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

należy dodać swoje rozwiązanie jako odpowiedź. – Xerkus

+0

zrobione, dziękuję za poradę! – RomanKonz

Odpowiedz

9

mam rozwiązać ten problem poprzez przeglądanie kodu źródłowego zf2

Jeśli wiesz, jak aby to zrobić, jest to naprawdę łatwe, powyższy kod prawie się zgadza!

Zamiast

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

trzeba użyć

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

jest pusta klasa pochodna, który jest używany w Zend \ Db \ SQL \ Sql

to pełny przykład pracy:

$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

Trochę późno, ale można również osiągnąć poprzez robi

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

__get magiczna metoda \ Zend \ Db \ SQL \ Select ma sprawę do gdzie która zwraca bieżącą gdzie() predykat, który pozwala Ci zrobić bardziej skomplikowane rzeczy, takie jak

$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'); 

listę wszystkich orzeczników dostępnych w ZF 2 (2.1.0) od t Gdzie on orzeczenie patrz:

+0

@Pang Update do wersji referencyjnej, zauważ, że ZF2 znacznie się zmieniło od czasu opublikowania tego posta. – fyrye