Doctrine orm 如何在Doctrine中编写插入查询
如何在条令中创建执行与以下SQL查询相同功能的插入查询: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;功能: 条令不是查询操作的工具。整个想
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);