2012-11-07 5 views
6

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 di WHERE in modo da poter utilizzare la colonna con alias dueDate, 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 uso fetch() o altri metodi PDO su $stmt non posso più utilizzarlo con la chiamata a format().
  • In alternativa c'è un modo migliore per farlo con Propel puro?

risposta

1

È necessario aggiungere alcuni passaggi. Questo è il processo logico:

  1. SQL chiamata che non include le colonne aggiuntive
  2. Idratare l'oggetto (s)
  3. SQL chiamare i valori ritorni per le colonne aggiuntive
  4. aggiornare l'oggetto idratata (s) con i valori della colonna extra

Spero che questo aiuti. Saluti.

Problemi correlati