Używam niestandardowego SQL, aby połączyć dwie tabele, zastosować niektóre logiki biznesowej do dat, a następnie użyć wyników do nawodnienia obiektu propel (kolekcja). Oto mój kod:Jak mogę uzyskać dodatkowe kolumny podczas nawadniania obiektów Propel za pomocą niestandardowego kodu SQL?
$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 ...
}
To pytanie jest w kilku częściach, ponieważ nie może być całkowicie lepszy sposób to zrobić - więc prosimy, aby sugestie innych niż tylko odpowiedzi na moje konkretne pytania:
- Używam
HAVING
zamiastWHERE
, dzięki czemu mogę użyć kolumny alikwotowejdueDate
, której chcę użyć jako części sprawdzenia i zamówienia, a także zwrócenia go jako części zestawu wyników do użycia później. Czy istnieje sposób na pobranie tej wartości, ale nadal uwadnia obiekt napędzający? Kiedy używamfetch()
lub innych metod PDO na$stmt
, nie mogę już używać tego z wywołaniem doformat()
. - Czy istnieje lepszy sposób, aby to zrobić z czystym Propelem?