ちなみに、現実の条件生成はもっとメンドクセーですじょ?

<?php
        $query = $tbl->select();

        // 中略

        // 案件の状態
        if (!is_a($sc->getState(), 'nothing')) {
            $tarState = null;
            if(is_a($sc->getState(), 'Model_ItemState_Interface')) {
                $tarState = $sc->getState();
            } else {
                $tarState = ItemStateManager::getState($sc->getState());
            }

            if (is_null($tarState)) {
                // 無効なステートなら0行戻す
                $query->where(false);
            } else {
                if (is_a($sc->getStateOption(), 'nothing')) {
                    $query->where('pi.procurement_item_condition = ?', $tarState->getStateCodeLarge());
                    if($tarState->getStateCodeMiddle() <> $tarState::STEP_MIDDLE_ROOT) {
                        $query->where('pi.procurement_item_condition_sub = ?', $tarState->getStateCodeMiddle());
                    }
                } else {
                    $arrow = '';
                    switch ($sc->getStateOption()) {
                        case $sc::STATE_UPPER:
                            $arrow = '>';
                            break;
                        case $sc::STATE_LOWER:
                            $arrow = '<';
                            break;
                    }
                    if ($arrow <> '') {
                        if($tarState->getStateCodeMiddle() == $tarState::STEP_MIDDLE_ROOT) {
                            $query->where("pi.procurement_item_condition $arrow= ?", $tarState->getStateCodeLarge());
                        } else {
                            $sql = new SqlHelper;
                            $sql->addOr($db->quoteInto("pi.procurement_item_condition $arrow ?", $tarState->getStateCodeLarge()));

                            $sql2 = new SqlHelper;
                            $sql2->addAnd($db->quoteInto('pi.procurement_item_condition = ?', $tarState->getStateCodeLarge()));
                            $sql2->addAnd($db->quoteInto("pi.procurement_item_condition_sub $arrow= ?", $tarState->getStateCodeMiddle()));

                            $sql->addOr($sql2->makeWhere());
                            $query->where($sql->makeWhere());
                        }
                    }
                }
            }
        }
        // 後略

こんなのが4・5個連続して並んでいるのですが、これをwhere/orWhereメソッドだけで実装したら死ねます。

まぁ、こんなレベルの条件生成はシステム全体で10個くらいしかないですケド。
大抵は、

<?php
        // 年度
        if (!is_a($sc->getYear(), 'nothing')) {
            $query->where('pi.expenditures_year=?', $sc->getYear());
        }

で終了。バリデーションはコントローラでやってね、って感じ?