Doc子句2在where子句中的日期(querybuilder)

时间:2013-04-10 12:20:06

标签: doctrine-orm zend-framework2 dql query-builder

我遇到了以下问题:我想要一个where子句来检查用户是否处于活动状态以及他是否拥有正确的日期。

用户包含以下内容:

  • 国家
  • 开始日期
  • 结束日期

因此,State应该保持为1,然后他应该查找state = 1并且当前日期在开始和结束之间。我现在有以下内容,它运行正常。但是不需要开始和结束日期。所以它可能是NULL。我怎样才能得到如下查询:

SELECT * FROM user / entity / user WHERE state = 1 AND((startdate< = CURRENT_DATE AND enddate> = CURRENT_DATE)或startdate == NULL OR enddate == NULL),所以我得到了所有活跃用户,而不仅仅是临时用户。

我现在已经设置了以下代码: 存储库:

    public function searchUser($columns, $order_by, $order)
    {
        //Create a Querybuilder
        $qb = $this->_em->createQueryBuilder();

        //andx is used to build a WHERE clause like (expression 1 AND expression 2)
        $or = $qb->expr()->andx();

        //Select all from the User-Entity
        $qb->select('u')
           ->from('User\Entity\User', 'u');



        foreach($columns as $column => $name) 
        {                        
            if($column == 'state') 
            {
                if($columns['state']['value'] == '1') {
                    $or = $this->betweenDate($qb, $or);
                    $or = $this->like($columns, $qb, $or);
                } elseif($columns['state']['value'] == '2') {
                    $or = $this->like($columns, $qb, $or);
                } elseif($columns['state']['value'] == '3') {
                    $or = $this->outOfDate($qb, $or);
                }
            } else {
                //Get a where clause from the like function
                $or = $this->like($columns, $qb, $or);
            }
        }

        //Set the where-clause
        $qb->where($or);

        //When there is a order_by, set it with the given parameters
        if(isset($order_by)) {
            $qb->orderBy("u.$order_by", $order);
        }

        //Make the query
        $query = $qb->getQuery();

        /*echo('<pre>');
        print_r($query->getResult());
        echo('</pre>');*/

        //Return the result
        return $query->getResult();

    }

    public function betweenDate($qb, $or)
        {
            $or->add($qb->expr()->lte("u.startdate", ":currentDate"));
            $or->add($qb->expr()->gte("u.enddate", ":currentDate"));
            //$or->add($qb->expr()->orx($qb->expr()->eq("u.startdate", null)));
            $qb->setParameter('currentDate', new \DateTime('midnight'));

            return $or;
        }

//This one works perfect
    public function like($columns, $qb, $or)
        {
            //Foreach column, get the value from the inputfield/dropdown and check if the value
            //is in the given label. 
            foreach($columns as $label=>$column){
                $value = $column['value'];
                $or->add($qb->expr()->like("u.$label", ":$label"));
                $qb->setParameter($label, '%' . $value . '%');
            }

            return $or;
        }

我也将这个“usersearch”用于其他领域。所以它应该从数据库中挑选出所有数据,只有状态不同,因为“过时”不在数据库中。所以它必须以不同方式检查。希望有人可以提供帮助。

问题解决了

$startdate = $qb->expr()->gt("u.startdate", ":currentDate");
    $enddate = $qb->expr()->lt("u.enddate", ":currentDate");

    $or->add($qb->expr()->orX($startdate, $enddate));

1 个答案:

答案 0 :(得分:3)

这就是我如何构建where子句:

//CONDITION 1 -> STATE = 1
$state = $qb->expr()->eq( 'state', ':state' );

//CONDITION 2 -> startdate <= CURRENT_DATE AND enddate >= CURRENT_DATE
$betweenDates = $qb->expr()->andX( 
    $qb->expr()->lte("u.startdate", ":currentDate"),
    $qb->expr()->gte("u.enddate", ":currentDate")
);

//CONDITION 3 -> startdate == NULL
$startDateNull = $qb->expr()->isNull( 'startdate' );

//CONDITION 4 -> enddate == NULL
$endDateNull = $qb->expr()->isNull( 'enddate' );

//CONDITION 5 -> <CONDITION 2> OR <CONDITION 3> OR <CONDITION 4>
$dates = $qb->expr()->orX( $betweenDates, $startDateNull, $endDateNull );

//CONDITION 6 -> <CONDITION 1> AND <CONDITION 5>
$whereClause = $qb->expr()->andX( $state, $dates );