0

I am trying to put this where-clause in my query with Zend 2 (Zend\Db\Sql):

WHERE `comunity_id` = '$communityId' 
  AND (   
   (`date_to` IS NULL AND `date_from` = CURDATE()) 
    OR 
   (`date_to` IS NOT NULL AND `date_to` >= CURDATE()) 

  )

using this method:

public function findByCommunityId($communityId, $limit = 10)
{
    $select = $this->getSelect();

    $where = new Where();

    $select->where(
        array(
        $where->equalTo('community_id',$communityId), PredicateSet::COMBINED_BY_AND,
        new PredicateSet(
            array(
                new IsNull('date_to'),
                $where->equalTo('date_from', new Expression('CURDATE()'))
            ), PredicateSet::COMBINED_BY_AND
        ),
        PredicateSet::COMBINED_BY_OR,               
        new PredicateSet(
            array(
                    new IsNotNull('date_to'),
                    $where->greaterThanOrEqualTo('date_to', new Expression('CURDATE()'))
            ),
            PredicateSet::COMBINED_BY_AND
        )           
        )

    );


    $select->order(array (
            'date_from' => 'ASC' 
    ));
    $select->limit($limit);

    \Zend\Debug\Debug::dump($select->getSqlString($this->getDbAdapter()->getPlatform()));die;

    return $this->select($select);
}

Which results in:

SELECT `com_community_events`.* 
FROM `com_community_events` 
WHERE (`community_id` = '12' AND `date_from` = CURDATE() AND `date_to` >= CURDATE()) 
AND AND AND (`date_to` IS NULL AND (`community_id` = '12' AND `date_from` = CURDATE()     AND `date_to` >= CURDATE())) AND OR AND (`date_to` IS NOT NULL AND (`community_id` = '12' AND `date_from` = CURDATE() AND `date_to` >= CURDATE())) 
ORDER BY `date_from` ASC 
LIMIT '10'

My question is why Zend puts multiple AND/OR keyword next to each other and why the first where clause about the community_id is included in the other part of the where clause?

1 Answer 1

1

Try this -

Note - Off course I haven't tried this particular code but this is the way I do it usually. Just in case it doesn't work as it is, at least it will give some on the usage of nest() and unnest().

$where = new Where();
$where->nest()
    ->equalTo('community_id', $communityId)
    ->and
        ->nest()
            ->isNull('date_to')
            ->and
            ->equalTo('date_from', new Expression('CURDATE()'))
        ->unnest()
    ->or
        ->nest()
            ->isNull('date_to')
            ->and
            ->greaterThanOrEqualTo('date_from', new Expression('CURDATE()'))
        ->unnest()
    ->unnest();

Good luck.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.