質問

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で動的に日付を計算する必要がありますが、画像が得られます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top