web-dev-qa-db-fra.com

Est-il possible d'utiliser createQueryBuilder pour l'insertion/la mise à jour? Si non, quelle fonction devrais-je utiliser?

Pour l'instant, j'ai réussi à créer une fonction qui récupère des données de la base de données à l'aide de la fonction createQueryBuilder de Doctrine.

Est-ce que quelqu'un sait s'il existe une fonction similaire pour insérer ou mettre à jour la base de données? Ou comment puis-je utiliser createQueryBuilder?

11
user1482442

Doctrine 2 ORM ne prend pas en charge INSERT via DQL ou le générateur de requêtes DQL . Pour une syntaxe complète, vérifiez le fichier EBNF de DQL .

Pour gérer les insertions dans ORM, vous devez toujours instancier manuellement une entité et la conserver avec le gestionnaire d'entités:

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

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

Vous ne pouvez gérer que SELECT, UPDATE et DELETE via DQL dans Doctrine ORM:

  • Sélectionner:

    SELECT u FROM My\Entity\User u WHERE u.id = :userId
    
  • Mettre à jour:

    UPDATE My\Entity\User u SET u.status = 'banned' WHERE u.id = :userId
    
  • Effacer

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

Vous pouvez également gérer ces opérations avec QueryBuilder:

  • Sélectionner:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->select('u')
        ->from('My\Entity\User', 'u')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
  • Effacer:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->delete('My\Entity\User', 'u')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
  • Mettre à jour:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->update('My\Entity\User', 'u')
        ->set('u.status', 'banned')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
27
Ocramius

Une autre option que vous avez à la place en utilisant un générateur de requêtes est d'utiliser les fonctions de préparation et d'exécution de Doctrine DBAL. N’est probablement pas aussi flexible que QueryBuilder, mais il pourrait être utile d’insérer des INSERT dans certaines situations.

La méthode à utiliser consiste à obtenir la connexion à la base de données à partir d’Entity Manager.

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

Si vous utilisez DBAL queryBuilder, il est possible d'insérer. 

$qb = $connection->createQueryBuilder();

Pour insérer avec le queryBuilder c'est comme ça:

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

utiliser QueryBuilder pour insérer des données n'est pas possible sauf si vous êtes prêt à écrire DQL ou SQL. Si vous cherchez un moyen d'insérer simplement des données dans votre table de base de données, vous devez tout d'abord vous assurer que les données sont chargées dans une classe Entity pour la table dans laquelle vous souhaitez insérer vos données. Par exemple, $em->persist($entity);

0
Rancantemos