Doctrine orm 如何在Doctrine中编写插入查询

Doctrine orm 如何在Doctrine中编写插入查询,doctrine-orm,sql-insert,Doctrine Orm,Sql Insert,如何在条令中创建执行与以下SQL查询相同功能的插入查询: INSERT INTO target (tgt_col1, tgt_col2) SELECT 'flag' as marker, src_col2 FROM source WHERE src_col1='mycriteria' 我仍然不相信这是您正在采取的正确方法,但是如果您确实需要出于任何原因运行SQL查询,您可以在原则中使用$entityManager->createNativeQuery;功能: 条令不是查询操作的工具。整个想

如何在条令中创建执行与以下SQL查询相同功能的插入查询:

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

我仍然不相信这是您正在采取的正确方法,但是如果您确实需要出于任何原因运行SQL查询,您可以在原则中使用$entityManager->createNativeQuery;功能:

条令不是查询操作的工具。整个想法是在实体级工作,而不是SQL级的表等。Doctrine的2 QueryBuilder甚至不支持通过DQL进行插入操作

下面是一小段伪代码,用以说明如何按照条令的方式进行:

    $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();
教义说:

如果要执行DELETE、UPDATE或INSERT语句,则本机 SQL API无法使用,可能会引发错误。使用 EntityManagergetConnection以访问本机数据库连接 并为这些查询调用executeUpdate方法

例子
对我来说,你似乎没有抓住重点。拥有ORM层(如Doctrine)的整个想法是,您根本不需要也不应该编写任何SQL查询…:-@ADi3ek我已经修改了我的问题,以澄清我在寻找什么。我试图编写一个条令查询,从一个表中选择行并将它们插入另一个表中。我只是在我的问题中包含了SQL查询,作为一种定义我想用条令做什么的方法。这并没有回答问题。以下是删除所有SQL引用后的查询:“使用条令,如何从一个表中选择记录子集并将其插入另一个表?”
// 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);