是否有可能使用createQueryBuilder进行插入/更新?如果没有,我应该使用什么功能?

use*_*442 13 insert-update createquery symfony doctrine-orm

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

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

Ocr*_*ius 29

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

要在ORM中处理插入,您始终手动实例化实体并使用实体管理器将其保留:

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

$entityManager->persist($user);
$entityManager->flush();
Run Code Online (Sandbox Code Playgroud)

你只能处理SELECT,UPDATEDELETE通过DQL教义ORM:

您也可以使用QueryBuilder处理这些操作:

  • 选择:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->select('u')
        ->from('My\Entity\User', 'u')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
Run Code Online (Sandbox Code Playgroud)
  • 删除:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->delete('My\Entity\User', 'u')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
Run Code Online (Sandbox Code Playgroud)
  • 更新:
    $queryBuilder = $entityManager->createQueryBuilder();
    $queryBuilder
        ->update('My\Entity\User', 'u')
        ->set('u.status', 'banned')
        ->where($queryBuilder->expr()->eq('u.id', ':userId'));
Run Code Online (Sandbox Code Playgroud)


mlw*_*mos 8

如果使用 DBAL queryBuilder,则可以插入。

$qb = $connection->createQueryBuilder();
Run Code Online (Sandbox Code Playgroud)

使用 queryBuilder 插入它是这样的:

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


Jav*_*xas 5

您使用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();
Run Code Online (Sandbox Code Playgroud)

  • 有一个原因,ORM不允许这样做.我们的想法是始终通过各种监听器,计算的提交顺序和DBAL类型转换. (3认同)
  • @Ocramius 还有你需要这个的原因,例如插入日志而不输入 ORM 的生命周期回调 (3认同)