복잡한 where 구문 작성예
2010. 3. 19. 11:03ㆍ99. 정리전 - 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
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);
$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)으로 할 수 밖에 없었다.
더 좋은 방법 아시는 분은 댓글로 알려주세요.
복잡한 괄호를 처리하기 위해서는 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);
(
(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)
->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)