使用自定义SQL对Propel对象进行保湿时,如何获得额外的列?

时间:2012-11-07 11:57:38

标签: php mysql propel

我使用自定义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 ... 
}

这个问题有几个部分,因为可能有更好的方法 - 所以除了回答我的具体问题之外,请随时提出建议:

  • 我使用的是HAVING而不是WHERE,因此我可以使用别名列dueDate,我想将其用作检查和订单的一部分,并将其返回作为稍后使用的结果集的一部分。有没有办法抓住这个值,但仍然保持推进物体?当我在fetch()上使用$stmt或其他PDO方法时,我无法再通过调用format()来使用此方法。
  • 或者,有更好的方法可以使用纯Propel吗?

1 个答案:

答案 0 :(得分:1)

您应该添加一些步骤。这是合乎逻辑的过程:

  1. 不包含额外列的SQL调用
  2. 水合物体
  3. SQL调用额外列的返回值
  4. 使用额外的列值
  5. 更新水合物体

    希望这会有所帮助。欢呼声。