5

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)", 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)", Criteria::CUSTOM);

ただし、必要がない限り、カスタムの回避策は使用したくありません。Criteria::CUSTOM を使用する以外のヒントはありますか?

4

2 に答える 2

2

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 固有の機能が組み込まれていないためです。

于 2008-11-03T22:58:31.190 に答える
1

そこで使用しているmysql日付コードを、その日付がすでに含まれている事前計算されたphp変数に置き換えるだけです。

すなわち

$monthAgo = '2008-10-03';
$c = new Criteria
$c->add(FoobarPeer::CREATED_AT, $monthAgo, Criteria::GREATER_THAN); 

明らかに、日付をハードコーディングするのではなく、PHPで動的に計算する必要がありますが、画像は得られます。

于 2008-11-03T23:40:49.043 に答える