Utilizzo SQL personalizzato per unire due tabelle, applicare alcune regole di business alle date, quindi utilizzare i risultati per idratare un oggetto Propel (raccolta). Qui è il mio codice:Come posso ottenere colonne aggiuntive durante l'idratazione degli oggetti Propel con SQL personalizzato?
$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 ...
}
Questa domanda viene in più parti, perché ci potrebbe essere un modo del tutto migliore di fare questo - quindi non esitate a dare suggerimenti diverso da solo rispondere alle mie domande specifiche:
- Sto usando
HAVING
invece diWHERE
in modo da poter utilizzare la colonna con aliasdueDate
, che desidero utilizzare come parte del controllo e dell'ordine, oltre a restituirla come parte del set di risultati da utilizzare in seguito. C'è un modo per afferrare questo valore ma idratare ancora l'oggetto propel? Quando usofetch()
o altri metodi PDO su$stmt
non posso più utilizzarlo con la chiamata aformat()
. - In alternativa c'è un modo migliore per farlo con Propel puro?