如何在ZF2中执行INSERT INTO SELECT查询

时间:2014-06-10 17:30:12

标签: zend-framework doctrine-orm zend-framework2

在ZF2中执行INSERT INTO SELECT查询的最佳方法是什么?

我需要在ZF2中开发一个函数,从一个表中选择一个记录子集并将这些记录插入另一个表中。如果我使用SQL编程,语句将如下所示:

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

我搜索了Doctrine文档但找不到INSERT方法。我在Doctrine标签下发布了一个similar question,缺乏响应让我相信INSERT INTO SELECT对于Doctrine来说太复杂了。

在ZF2中,我似乎“可以”使用Zend\Db\Sql\Sql。但是,对于该解决方案,SELECTINSERT是两个独立的函数,看起来INSERT函数一次只处理一条记录。因此,Zend\Db\Sql\Sql解决方案需要1)一组语句来从源表中选择数据,2)可能是将该数据对象转换为数组的函数,以及3)foreach函数循环遍历数据数组并通过4)一组插入语句将每个记录单独添加到目标表。与SQL中可能的单个语句相比,这看起来很麻烦。

有更好的方法吗?

1 个答案:

答案 0 :(得分:3)

如果是TableGateway那么它肯定适用于最新版本的ZF2,即2.3.2

参考Album模块 -

  1. 创建了一个album的重复表,并将其命名为album_old
  2. 清空album表。
  3. 所以现在album表为空,album_old具有值。

    要将记录从album_old复制到album,请执行此操作 -

    use Zend\Db\Sql\Select;
    ....
    use Zend\Db\Sql\Insert;
    
    $select = new Select('album_old');
    $select->columns(array('artist', 'title', 'cover', 'extra'));
    
    $insert = new Insert();
    $insert->into('album');
    $insert->columns(array('artist', 'title', 'cover', 'extra'));
    
    $insert->values($select);
    //OR
    $insert->select($select);
    
    $this->tableGateway->insertWith($insert);
    

    album_old中的所有值都已插入album表格。

    参考: https://github.com/zendframework/zf2/blob/master/library/Zend/Db/Sql/Insert.php      
    在这里,您会发现function values()可以arrayinstanceof Select
    并且还有一个新的select()功能。