6

カスタム SQL を使用して 2 つのテーブルを結合し、ビジネス ロジックを日付に適用し、結果を使用して推進オブジェクト (コレクション) をハイドレートしています。これが私のコードです:

$testtypes = TesttypeQuery::create()->find();

foreach ($testtypes as $testtype) {

  /* work out what most recent schedule */
  $con = \Propel::getConnection(SchedulePeer::DATABASE_NAME);
  $sql = "SELECT `schedule`.*, (`schedule`.`last` + INTERVAL `duration`.`weeks` WEEK + INTERVAL `duration`.`months` MONTH + INTERVAL `duration`.`years` YEAR) AS `dueDate` FROM `schedule` LEFT JOIN `duration` ON `schedule`.`duration_id` = `duration`.`id` HAVING `schedule`.`testtype_id` = {$testtype->getId()} AND `dueDate` < NOW() ORDER BY `dueDate` ASC LIMIT 1";
  $stmt = $con->prepare($sql);
  $stmt->execute();
  $formatter = new \PropelObjectFormatter();
  $formatter->setClass(SchedulePeer::OM_CLASS);
  $schedules = $formatter->format($stmt);

  // more stuff here ... 
}

これを行うための完全に良い方法があるかもしれないので、この質問はいくつかの部分に分かれています - したがって、私の特定の質問に答えるだけでなく、自由に提案をしてください:

  • チェックと注文の一部として使用したいエイリアス列を使用できるように、HAVING代わりに使用しています。また、後で使用する結果セットの一部として返すこともできます。この値を取得しながら、推進オブジェクトをハイドレートする方法はありますか? または他の PDO メソッドを使用すると、 への呼び出しでこれを使用できなくなります。WHEREdueDatefetch()$stmtformat()
  • あるいは、純粋な Propel でこれを行うより良い方法はありますか?
4

1 に答える 1

1

いくつかのステップを追加する必要があります。これは論理的なプロセスです。

  1. 余分な列を含まない SQL 呼び出し
  2. オブジェクトを水和する
  3. 余分な列の戻り値を SQL 呼び出し
  4. ハイドレートされたオブジェクトを追加の列値で更新します

お役に立てれば。乾杯。

于 2012-11-14T15:46:58.770 に答える