2

私は次の問題を抱えています: ユーザーがアクティブであるかどうか、および彼が正しい日付を持っているかどうかを確認する where 句が必要です。

ユーザーには以下が含まれます。

  • 開始日
  • 終了日

そのため、State は 1 のままにし、state = 1 を探し、現在の日付が開始日と終了日の間にあることを確認します。私は今、以下を持っています、そしてそれはうまくいきます。ただし、開始日と終了日は必須ではありません。したがって、NULL になる可能性があります。次のようなクエリを取得するにはどうすればよいですか:

SELECT * 
FROM user/entity/user 
WHERE 
  state = 1 
  AND (
    (startdate <= CURRENT_DATE AND enddate >= CURRENT_DATE) 
    OR 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));
4

1 に答える 1

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 );
于 2013-04-10T17:05:41.920 に答える