2012-11-07 7 views
6

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 zamiast WHERE, dzięki czemu mogę użyć kolumny alikwotowej dueDate, 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żywam fetch() lub innych metod PDO na $stmt, nie mogę już używać tego z wywołaniem do format().
  • Czy istnieje lepszy sposób, aby to zrobić z czystym Propelem?

Odpowiedz

1

Powinieneś dodać kilka kroków. Jest to proces logiczny:

  1. SQL wezwanie, które nie zawierają dodatkowych kolumn
  2. Soda przedmiot (y)
  3. SQL zadzwonić wartości powraca w dodatkowych kolumnach
  4. zaktualizować nawilżona obiekt (s) z dodatkowymi wartościami kolumny

Mam nadzieję, że to pomoże. Twoje zdrowie.

Powiązane problemy