【问题标题】:How to perform an INSERT INTO SELECT query in ZF2如何在 ZF2 中执行 INSERT INTO SELECT 查询
【发布时间】:2014-07-31 14:13:51
【问题描述】:

在 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 中可能的单个语句相比,这似乎很麻烦。

有没有更好的办法?

【问题讨论】:

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


    【解决方案1】:

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

    参考Album 模块-

    1. 创建了album 的重复表并将其命名为album_old
    2. 清空了album 表。

    所以现在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()可以带array或者instanceof Select
    还有一个新的select() 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 2015-04-07
      • 1970-01-01
      • 2012-02-21
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      相关资源
      最近更新 更多