Можно ли использовать 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);