Запрос на обновление доктрины с помощью LIMIT - PullRequest
2 голосов
/ 17 января 2012

Я хотел бы сделать запрос на обновление с LIMIT следующим образом:

UPDATE anytable SET anycolumn = 'anyvalue' WHERE anothercolumn='anothervalue' LIMIT 20

Как это возможно с учением 2.1?

Ответы [ 3 ]

4 голосов
/ 19 июля 2012

Я обнаружил, что мне нужно извлечь соединение из entityManager и вызвать executeUpdate:

$em->getConnection()->executeUpdate(
    "UPDATE anytable SET anycolumn = 'anyvalue'
     WHERE anothercolumn='anothervalue'
     LIMIT 20");

Страница доктрины о нативных запросах говорит:

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

2 голосов
/ 17 января 2012

Не специфично для доктрины, но возможно с подзапросом?

UPDATE messages SET test_read=1
 WHERE id IN (
     SELECT id FROM (
         SELECT id FROM messages 
         ORDER BY date_added DESC  
         LIMIT 5, 5
     ) tmp
 );
0 голосов
/ 17 января 2012

EDIT:

Вы можете сделать это двумя разными способами:

1 - Создать запрос напрямую, используя DQL:

$query = $entityManager->createQuery('UPDATE Entities\User u SET u.someValue = newValue WHERE u.id = someId');

// this will add the LIMIT statement
$query->setMaxResults(20);

$query->execute();

2 - Создать запрос с помощью QueryBuilder:

$qb = $this->_em->createQueryBuilder();

$query = $qb->update('Entities\User', 'u')
            ->set('u.someValue', newValue)
            ->where('u.id = someId')
            ->getQuery();

// this will add the LIMIT statement
$query->setMaxResults(20);   

$query->execute();

вы должны сделать: echo $query->getSQL(); чтобы проверить sql, сгенерированный для этих двух

EDIT: другой альтернативой (не рекомендуется) является использование Native SQL

...