Можно ли использовать createQueryBuilder для вставки / обновления? Если нет, то какую функцию я должен использовать?

пока мне удалось создать функцию, которая извлекает данные из базы данных, используя функцию Createquerybuilder доктрины.

кто-нибудь знает, есть ли аналогичная функция для вставки или обновления базы данных? Или как я могу использовать createQueryBuilder?

4 ответов


доктрина 2 ОРМ не поддерживает INSERT via DQL или DQL Query builder. Для полного синтаксиса проверьте EBNF DQL.

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

$user = new \My\Entity\User();

$entityManager->persist($user);
$entityManager->flush();

вы можете обрабатывать только SELECT, UPDATE и DELETE через DQL в доктрине ОРМ:

  • выберите:

    SELECT u FROM My\Entity\User u WHERE u.id = :userId
    
  • обновление:

    UPDATE My\Entity\User u SET u.status = 'banned' WHERE u.id = :userId
    
  • удалить

    DELETE My\Entity\User u WHERE u.id = :userId
    

вы также можете обрабатывать эти операции с помощью QueryBuilder:

  • выберите:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->select('u')
        ->from('My\Entity\User', 'u')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
  • удалить:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->delete('My\Entity\User', 'u')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
  • обновление:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->update('My\Entity\User', 'u')
        ->set('u.status', 'banned')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));

другой вариант, который у вас есть вместо использования QueryBuilder, - это использование Doctrine DBAL prepare и execute функций. Вероятно, это не так гибко, как использовать QueryBuilder, но для вставки do в некоторых ситуациях может быть полезно.

способ использования-получение соединения с базой данных из диспетчера сущностей.

$sql = "INSERT INTO table (field1, field2) VALUES ('foo', 'var')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->bindValue(':invoice', $invoiceId);
$result = $stmt->execute();

Если вы используете DBAL queryBuilder, можно вставить.

$qb = $connection->createQueryBuilder();

для вставки с помощью queryBuilder это выглядит так:

$qb->insert('MuBundle:MyClass', 'momc')
   ->values (array(
       'property1 (id for example)' => '?'
       'property2 (name for exmaple)' => '?'
   ))
   ->setParameter(0, $id)
   ->setparameter(1, $name)

использование QueryBuilder для вставки данных невозможно, если вы не готовы написать DQL или SQL. Если вы ищете способ просто вставить данные в таблицу базы данных, вы должны прежде всего убедиться, что данные загружены в класс сущности для таблицы, в которую вы хотите вставить свои данные. Например $em->persist($entity);