【问题标题】:how to write an insert query in Doctrine如何在 Doctrine 中编写插入查询
【发布时间】:2014-06-09 05:49:58
【问题描述】:

如何在 Doctrine 中创建一个插入查询,该查询将执行与以下 SQL 查询相同的功能:

INSERT INTO target (tgt_col1, tgt_col2) 
SELECT 'flag' as marker, src_col2 FROM source 
WHERE src_col1='mycriteria'

【问题讨论】:

  • 好吧,在我看来,您好像错过了重点。拥有像 Doctrine 这样的 ORM 层的整个想法是,您根本不需要(也不应该)编写任何 SQL 查询...... :-)
  • @ADi3ek 我已经修改了我的问题以澄清我在寻找什么。我正在尝试编写一个 Doctrine 查询,它将从一个表中选择行并将它们插入到另一个表中。我只在我的问题中包含了 SQL 查询,作为定义我想用 Doctrine 做什么的一种方式。

标签: doctrine-orm sql-insert


【解决方案1】:

教义documentation 说:

如果你想执行 DELETE、UPDATE 或 INSERT 语句,Native SQL API 无法使用,可能会抛出错误。采用 EntityManager#getConnection() 访问本机数据库连接 并为这些查询调用 executeUpdate() 方法。

示例

// Get entity manager from your context.
$em = $this->getEntityManager();

/**
 * 1. Raw query
 */

$query1 = "
    INSERT INTO target (tgt_col1, tgt_col2) 
    SELECT 'flag' as marker, src_col2 FROM source 
    WHERE src_col1='mycriteria'
";

$affectedRows1 = $em->getConnection()->executeUpdate($query1);

/**
 * 2. Query using class metadata.
 */

$metadata = $em->getClassMetadata(Your\NameSpace\Entity\Target::class);
$tableName = $metadata->getTableName();
$niceTitle = $metadata->getColumnName('niceTitle');
$bigDescription = $metadata->getColumnName('bigDescription');

$metadata2 = $em->getClassMetadata(Your\NameSpace\Entity\Source::class);
$table2Name = $metadata2->getTableName();
$smallDescription = $metadata2->getColumnName('smallDescription');

$query2 = "
    INSERT INTO $tableName ($niceTitle, $bigDescription) 
    SELECT 'hardcoded title', $smallDescription FROM $table2Name 
    WHERE $niceTitle = 'mycriteria'
";

$affectedRows2 = $em->getConnection()->executeUpdate($query2);

【讨论】:

    【解决方案2】:

    我仍然不相信这是您正在采取的正确方法,但如果您真的出于任何原因需要运行 SQL 查询,您可以使用 $entityManager->createNativeQuery(); 函数在 Doctrine 中执行此操作:

    http://doctrine-orm.readthedocs.org/en/latest/reference/native-sql.html

    Doctrine 不是查询操作的工具。整个想法是在实体级别上工作,而不是 SQL 级别(表等)。 Doctrine 的 2 QueryBuilder 甚至不支持通过 DQL 进行的 INSERT 操作。

    下面的小sn-p伪代码说明如何以“教义的方式”完成:

        $qb = $entityManager->createQueryBuilder();
        $qb->select('s')
            ->from('\Foo\Source\Entity', 's')
            ->where('s.col1 = :col1')
            ->setParameter('col1', 'mycriteria');
    
        $sourceEntities =  $qb->getQuery()->getResult();
        foreach($sourceEntities as $sourceEntity) {
            $targetEntity = new \Foo\Target\Entity();
            $targetEntity->col1 = $sourceEntity->col1;
            $targetEntity->col2 = $sourceEntity->col2;
    
            $entityManager->persist($targetEntity);
        }
    
        $entityManager->flush();
    

    【讨论】:

    • 这不能回答问题。这是删除了所有 SQL 引用的查询:“使用 Doctrine,如何从一个表中选择记录子集并将它们插入到另一个表中?”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    相关资源
    最近更新 更多