カスタム 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 メソッドを使用すると、 への呼び出しでこれを使用できなくなります。WHERE
dueDate
fetch()
$stmt
format()
- あるいは、純粋な Propel でこれを行うより良い方法はありますか?