14

现在,我成功地创建了一个使用 Doctrine 的函数 createQueryBuilder 从数据库中检索数据的函数。

有谁知道是否有类似的功能来插入或更新数据库?或者我如何使用 createQueryBuilder?

4

4 回答 4

31

Doctrine 2 ORM 不支持INSERT通过DQLDQL 查询生成器。有关完整的语法,请检查DQL 的 EBNF

要在 ORM 中处理插入,您总是手动实例化一个实体并将其保存在实体管理器中:

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

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

您只能在 Doctrine ORM 中通过 DQL 处理SELECT和处理UPDATEDELETE

  • 选择:

    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'));
于 2013-03-26T06:06:02.130 回答
8

另一个使用 QueryBuilder 的选项是使用 Doctrine DBAL 准备和执行函数。可能不如使用 QueryBuilder 灵活,但对于在某些情况下执行 INSERT 可能很有用。

使用方法是从实体管理器获取数据库连接。

$sql = "INSERT INTO table (field1, field2) VALUES ('foo', 'var')";
$stmt = $em->getConnection()->prepare($sql);
$stmt->bindValue(':invoice', $invoiceId);
$result = $stmt->execute();
于 2013-03-27T01:08:26.707 回答
8

如果您使用 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)
于 2016-06-21T08:28:25.600 回答
0

除非您愿意编写 DQL 或 SQL,否则无法使用 QueryBuilder 插入数据。如果您正在寻找一种简单地将数据插入数据库表的方法,则必须首先确保将数据加载到要插入数据的表的实体类中。例如$em->persist($entity);

于 2016-03-10T14:00:45.393 回答