PropelでMySQL関数を使用する方法
質問
1か月以上前のレコードを選択したい。
クエリは次のとおりです。SELECT * FROM foobar WHERE created_at> DATE_SUB(curdate()、INTERVAL 1 MONTH)
SymfonyでPropelを使用して、次のことを行います:
$ c =新しい基準
$ c-> add(FoobarPeer :: CREATED_AT、" DATE_SUB(curdate()、INTERVAL 1 MONTH)&quot ;, Criteria :: GREATER_THAN);
Propelが生成するものは次のとおりです:SELECT * FROM foobar WHERE created_at> 'DATE_SUB(curdate()、INTERVAL 1 MONTH)'-言い換えると、MySQL関数を一重引用符で囲んで、(意味のない)文字列にし、レコードを取得しません。
今までやったことは
$ c-> add(FoobarPeer :: CREATED_AT、" created_at> DATE_SUB(curdate()、INTERVAL 1 MONTH)&quot ;, 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に依存せず、単純な設定値の変更を行うことで移行を支援するため、DBMS固有の機能が組み込まれていないためです。
他のヒント
そこで使用しているmysql日付コードを、その日付が既に含まれている事前計算されたphp変数に置き換えるだけです。
i.e。
$monthAgo = '2008-10-03';
$c = new Criteria
$c->add(FoobarPeer::CREATED_AT, $monthAgo, Criteria::GREATER_THAN);
明らかに、ハードコーディングするのではなく、phpで動的に日付を計算する必要がありますが、画像が得られます。