propel에서 mySQL 함수를 사용하는 방법
문제
1 개월 또는 새로 인한 레코드를 선택하고 싶습니다.
쿼리는 다음과 같습니다. select * from foobar where where where where where where where where where where where where where> date_sub (curdate (), 1 개월 간격)
Symfony에서 Propel을 사용하여 다음을 수행합니다.
$ c = 새로운 기준
$ c-> add (foobarpeer :: create_at, "date_sub (curdate (), 간격 1 개월", criteria :: Greater_than);
Propel이 생성하는 것은 : select * from foobar where where where where where where where where where where where hate_sub (curdate (), 1 개월 간격) - 즉, mysql 함수를 단일 따옴표에 넣어 (무의미한) 문자열을 만들고 나는 얻지 못합니다. 기록.
내가 지금 한 일은 다음과 같습니다.
$ c-> add (foobarpeer :: create_at, "create_at> date_sub (curdate (), 간격 1 개월", criteria :: custom);
그러나 내가 필요하지 않으면 맞춤형 해결 방법을 사용하고 싶지 않습니다. Criteria :: Custom을 사용하는 것 외에 힌트가 있습니까?
해결책
Criteria :: Custom 또는 사용자 정의 SQL 쿼리를 사용하는 것 이상의 옵션이 없다고 생각합니다.
$con = Propel::getConnection(DATABASE_NAME);
$sql = "SELECT foobar.* FROM foobar WHERE created_at > DATE_SUB(curdate(), INTERVAL 1 MONTH)";
$stmt = $con->prepare($sql);
$stmt->execute();
$books = FoobarPeer::populateObjects($stmt);
Propel은 간단한 구성 값 변경을 수행하여 마이그레이션을 돕기 위해 DBMS-Agnostic이되기 때문에 DBMS 특정 기능이 내장되어 있기 때문입니다.
다른 팁
사용중인 MySQL 날짜 코드를 해당 날짜가 이미있는 미리 계산 된 PHP 변수로 바꾸십시오.
즉
$monthAgo = '2008-10-03';
$c = new Criteria
$c->add(FoobarPeer::CREATED_AT, $monthAgo, Criteria::GREATER_THAN);
분명히, 당신은 그것을 하드 코딩하는 대신 PHP의 날짜를 동적으로 계산해야하지만, 당신은 그림을 얻습니다.