Выполнить пользовательский SQL в Symfony - PullRequest
5 голосов
/ 16 марта 2011

Я пытаюсь выполнить пользовательский SQL для получения некоторых объектов модели в приложении Symfony. В Интернете я нашел учебное пособие, в котором говорилось что-то вроде этого, что позволило бы мне выполнить запрос, хотя и не заполнял модели (заполнение модели не является серьезной проблемой, это только для данных только для чтения).

$pdo = Doctrine_Manager::getInstance()->connection()->getDbh();
$pdo->prepare("SELECT * from something complicated");
$pdo->execute();
$this->sensorReadings = $pdo->fetchAll();

Но я получаю сообщение об ошибке:

Fatal error: Call to undefined method PDO::execute()
in sfproject/apps/frontend/modules/site/actions/actions.class.php 

Ответы [ 3 ]

9 голосов
/ 16 марта 2011
$query = "SELECT * from something complicated";
$rs = Doctrine_Manager::getInstance()->getCurrentConnection()->fetchAssoc($query);

Результатом является массив.

2 голосов
/ 24 марта 2011
// get Doctrine_Connection object
$con = Doctrine_Manager::getInstance()->connection();
// execute SQL query, receive Doctrine_Connection_Statement
$st = $con->execute("SELECT User.* FROM ....");
// fetch query result
$result = $st->fetchAll();

// convert array to objects
foreach ($result as $userArray) {
    $user = new User();
    $user->fromArray($userArray);
    ...
}

Этот код не очень короткий, но позволяет выполнить пользовательский запрос через существующее соединение Doctrine и получить ваш объект в конце.

0 голосов
/ 16 апреля 2013

Чтобы ответить на ваш вопрос (это делается из задачи):

$databaseManager = new sfDatabaseManager ( $this->configuration );
Doctrine_Manager::connection ()->setAttribute ( Doctrine_Core::ATTR_AUTO_FREE_QUERY_OBJECTS, true );

$dbOptions = Doctrine_Manager::connection ()->getManager ()->getConnection ( 'doctrine' )->getOptions ();
$dbDsn = $dbOptions['dsn'];
$dbDsnArr = explode ( ';', $dbDsn );
$dbHost = str_replace ( 'mysql:host=', '', $dbDsnArr[0] );
$dbName = str_replace ( 'dbname=', '', $dbDsnArr[1] );
$dbUn = $dbOptions['username'];
$dbPw = $dbOptions['password'];

Предполагается, что DSN настроен так: dsn: 'mysql: host = somedomain; dbname = dbname '

Этот код позволяет вам получить информацию о соединении с базой данных любого соединения, поэтому он будет работать и для нескольких соединений

Надеюсь, это поможет ...

...