2012-09-26 25 views
5

我真的不明白瞭如何使用謂詞Zend框架中使用謂詞2.ZF2 Zend的 DB SQL 的Sql在條件

這是我的了:

$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\Predicate\Predicate(); 
$sql->where($predicate->greaterThan('filterColumn','20); 

這是我試過了,沒有拋出呃ROR,但它不工作:-(

這是我所期望的SQL:

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

你應該添加您的解決方案作爲答案。 – Xerkus

+0

完成了,感謝您的建議! – RomanKonz

回答

9

我通過查看zf2

的源代碼解決了這個問題。如果你知道如何要做到這一點,這很容易,上面的代碼幾乎是正確的!

而不是

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

,你必須使用

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

它是一個空的派生類,即在Zend的\ DB \ SQL \的Sql

使用,這是完整的工作示例:

$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

有點晚了,但你也可以通過做

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

\ Zend的\ DB \ SQL \選擇的__get魔術方法做到這一點對那裏返回當前其中()謂詞,它允許的情況下,你做更復雜的事情,如

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

對於所有謂詞可用(2.1.0)在t列表ZF 2他斷言在哪裏看到:

+0

@Pang更新至引用版本,請注意自本文發佈以來ZF2發生了顯着變化。 – fyrye