Заявление об обновлении собственного запроса доктрины 2

Как сделать собственный SQL-запрос в Doctrine 2, выполняя оператор обновления? Для метода createNativeQuery в EntityManager требуется второй параметр (ResultSetMapping), чтобы иметь возможность сопоставлять наборы результатов с объектами.

Но при обновлении (или вставке, или установке, или...) нет результата для сопоставления. Передача null или просто нового ResultSetMapping() выдает ошибку.

Поддерживаются ли только избранные запросы для собственного sql?


person Sewdn    schedule 23.06.2011    source источник


Ответы (2)


По сути то же самое с факеном,

это из документов:

Если вы хотите выполнить операторы DELETE, UPDATE или INSERT, нельзя использовать Native SQL API и, вероятно, будут возникать ошибки. Используйте EntityManager#getConnection() для доступа к собственному соединению с базой данных и вызовите метод executeUpdate() для этих запросов.

одно замечание по использованию - объект соединения можно получить из EntityManager:

$conn = $entityManager->getConnection();
$rowsAffected = $conn->executeUpdate($sql, $params, $types);
person quickshiftin    schedule 05.09.2011

Операторы обновления обычно довольно просты, поэтому вы можете использовать обычный способ Doctrine2 (т. е. программно обновлять сущности и вызывать EntityManager::flush() ИЛИ использовать Обновления DQL).

Сказав это, если вы действительно хотите использовать обычный SQL, вы всегда можете сделать это так:

  1. Сохраните объект подключения к базе данных, который вы получили при создании соединения с Doctrine2:

    $connection = \Doctrine\DBAL\DriverManager::getConnection($dbConfig->toArray(),null,$evm);

  2. Выполните любой SQL, который вы хотите, используя доступные методы в соединение объект, например:

    $connection->executeUpdate($sql, $params, $types); $connection->exec($sql); ...

person faken    schedule 24.06.2011
comment
Я хочу обновить поле ранга для всех записей на основе порядка в одном из других полей. Что-то вроде: Установить @rank := 0; ВСТАВИТЬ В рейтинг (id, rank) ВЫБРАТЬ id, @rank := @rank+1 ИЗ рейтинга ORDER BY score DESC ON DUPLICATE KEY UPDATE rank = @rank; Не думаете, что это будет возможно с использованием DQL? - person Sewdn; 29.06.2011
comment
Это другой вопрос, и я не совсем понимаю его с таким коротким комментарием; Я предлагаю вам открыть еще один вопрос, задав этот вопрос, но предложите более подробную информацию. Тем не менее, если вы знаете, как выполнить это ОБНОВЛЕНИЕ в SQL, вы всегда можете использовать ответ, который я дал на ваш исходный вопрос, который будет работать. - person faken; 01.07.2011