복잡한 where 구문 작성예

2010. 3. 19. 11:0399. 정리전 - IT/17. Symfony 퉷퉷


편하자고 만든 심포니1.0의
Criteria는
복잡한 구문에서는 때려버리고 싶을 정도로 사용하기 퉷퉷퉷!


요런 구문의 Criteria화
SELECT bbs_sample.ID, bbs_sample.TITLE, bbs_sample.USERNAME,
       bbs_sample.EMAIL, bbs_sample.COMMENT, bbs_sample.CREATED_AT,
       bbs_sample.UPDATED_AT, UPPER(bbs_sample.USERNAME)
  FROM bbs_sample
WHERE  ((bbs_sample.TITLE='はじめまして' OR bbs_sample.EMAIL LIKE '%gmail.co%')
        OR bbs_sample.CREATED_AT>='2008-09-19 09:00:00')
        AND bbs_sample.CREATED_AT<='2008-09-24 21:00:00'
ORDER BY UPPER(bbs_sample.USERNAME) ASC LIMIT 3, 10

상기의 구문은 아래와 같이 표현할 수 있다.
$c = new Criteria();
$c1 = $c->getNewCriterion(bbsDataPeer::TITLE, 'はじめまして');
$c2 = $c->getNewCriterion(bbsDataPeer::EMAIL, '%gmail.co%', Criteria::LIKE);
$c3 = $c->getNewCriterion(bbsDataPeer::CREATED_AT, '2008-09-19 09:00:00', Criteria::GREATER_EQUAL);
$c4 = $c->getNewCriterion(bbsDataPeer::CREATED_AT, '2008-09-24 21:00:00', Criteria::LESS_EQUAL);
$c1->addOr($c2);
$c1->addOr($c3);
$c->add($c1);
$c->add($c4);
$c->setOffset(3);
$c->setLimit(10);
$c->addAscendingOrderByColumn(bbsDataPeer::USERNAME);
$this->bbs_dataList = bbsDataPeer::doSelect($c);

여기서 잠깐
getNewCriterion(컬럼, 값, 조건); 에서 값은 무조건 따옴표'값' 형태로 출력되므로 따옴표를 없애고 컬럼명을 사용하기 위해서는 아래와 같이 해야 한다.
복잡한 괄호를 처리하기 위해서는 getNewCriterion를 사용해야 하나 값부분은 따옴표 처리되서 나오기 때문에 커스텀 옵션(Criteria::CUSTOM)으로 할 수 밖에 없었다.
더 좋은 방법 아시는 분은 댓글로 알려주세요.

괄호가 많은 WHERE절 Criteria화
WHERE (
   (
        (content_item_sell.ENSEN_ID1=master_ensen.ENSEN_ID
        AND content_item_sell.EKI_ID1=master_ensen.EKI_ID)
     OR (content_item_sell.ENSEN_ID2=master_ensen.ENSEN_ID
        AND content_item_sell.EKI_ID2=master_ensen.EKI_ID)
   ) OR
    (content_item_sell.ENSEN_ID3=master_ensen.ENSEN_ID
      AND content_item_sell.EKI_ID3=master_ensen.EKI_ID)
)
                                           ↓
$c = new Criteria();
$c1 = $c->getNewCriterion(XXX::ENSEN_ID1, XXX::ENSEN_ID1 . ' = ' . YYY::ENSEN_ID, Criteria::CUSTOM);
$c2 = $c->getNewCriterion(XXX::EKI_ID1, XXX::EKI_ID1 . ' = ' .YYY::EKI_ID, Criteria::CUSTOM);
$c1->addAnd($c2);
$c3 = $c->getNewCriterion(XXX::ENSEN_ID2, XXX::ENSEN_ID2 . ' = ' .YYY::ENSEN_ID, Criteria::CUSTOM);
$c4 = $c->getNewCriterion(XXX::EKI_ID2, XXX::EKI_ID2 . ' = ' .YYY::EKI_ID, Criteria::CUSTOM);
$c3->addAnd($c4);
$c5 = $c->getNewCriterion(XXX::ENSEN_ID3, XXX::ENSEN_ID3 . ' = ' .YYY::ENSEN_ID, Criteria::CUSTOM);
$c6 = $c->getNewCriterion(XXX::EKI_ID3, XXX::EKI_ID3 . ' = ' .YYY::EKI_ID, Criteria::CUSTOM);
$c5->addAnd($c6);

$c1->addOr($c3);
$c1->addOr($c5);
$c->add($c1);

그 외 SQL구문의 Criteria화
//WHERE column = value
->add(column, value);

//WHERE column <> value
->add(column, value, Criteria::NOT_EQUAL);

//> , <
Criteria::GREATER_THAN, Criteria::LESS_THAN

//>=, <=
Criteria::GREATER_EQUAL, Criteria::LESS_EQUAL

//IS NULL, IS NOT NULL
Criteria::ISNULL, Criteria::ISNOTNULL

//LIKE, ILIKE
Criteria::LIKE, Criteria::ILIKE

//IN, NOT IN
Criteria::IN, Criteria::NOT_IN

//ORDER BY column ASC
->addAscendingOrderByColumn(column);

//ORDER BY column DESC
->addDescendingOrderByColumn(column);

//LIMIT limit
->setLimit(limit)

//OFFSET offset
->setOffset(offset)

//FROM table1, table2 WHERE table1.col1 = table2.col2
->addJoin(col1, col2)

//FROM table1 LEFT JOIN table2 ON table1.col1 = table2.col2
->addJoin(col1, col2, Criteria::LEFT_JOIN)

//FROM table1 RIGHT JOIN table2 ON table1.col1 = table2.col2
->addJoin(col1, col2, Criteria::RIGHT_JOIN)