Можно ли «подготовить» критерии Propel 1.4, чтобы их можно было эффективно использовать внутри цикла? - PullRequest
2 голосов
/ 10 сентября 2010

Я использую Symfony 1.3 с Propel 1.4. Мне нужно использовать подготовленный запрос, который будет использоваться внутри цикла, меняющего значения связанных параметров.

Возможно ли это сделать с помощью Propel 1.4? Я хочу получать результаты в виде объектов, поэтому не хочу использовать необработанный SQL, если смогу помочь.

1 Ответ

2 голосов
/ 05 октября 2010

Propel, похоже, не поддерживает это из коробки. Возьмите один из примеров, класс Book. BookPeer::doSelect() вызывает BookPeer::doSelectStmt() и передает результат BookPeer::populateObjects(). BookPeer::doSelectStmt() вызывает BasePeer::doSelect(), который всегда вызывает BasePeer::createSelectSql() для создания оператора SQL, подготавливает его и передает его BasePeer::populateStmtValues() для фактического связать значения.

Вы можете взять код из этих методов, чтобы получить что-то вроде этого (без исключения или обработки транзакций):

$criteria = new Criteria();
$criteria->addThis();
$criteria->addThat();


$con = Propel::getConnection($criteria->getDbName(), Propel::CONNECTION_READ);
$params = array();
$sql = BasePeer::createSelectSql($criteria, $params);
$stmt = $con->prepare($sql);
// $stmt is a prepared PDOStatement
// $params is an array of the form: [{'table': 'tableName', 'column': 'columnName', 'value': 'paramValue'}, ...]
// You can keep this format and use BasePeer::populateStmtValues(), or you can call $stmt->bindParam() yourself

// Now in the loop, we set the params ourself
foreach ($loop as $loopData) {
    // Bind the params, using your preferred method
    // ...

    // Pass the prepared and bound statement to populateObjects()
    $books = BookPeer::populateObjects($stmt);

    // Do something with the found objects
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...